조 병 규 Software Quality Lab. 한 국 교 통 대 학 교

Slides:



Advertisements
Similar presentations
는 한국능률협회컨설팅의 글로벌 브랜드입니다. 한국환경산업기술원. 1 I. 조사 목적 제 1 장. 조사 개요 고객만족 수준의 정확한 파악 고객에게 제공하는 상품 / 서비스의 Quality 향상 본 조사는 한국환경산업기술원이 설립목적에 근거하여 제공하고 있는 각종 서비스에.
Advertisements

G202G202 G201G201.
2012 대입의 이해와 준비방안 경기도진학지도지원단 일시 : 2010년 10월 11일 장소 : 수리고등학교.
제6장 조건문.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
스토리텔링마케팅사례 패션디자인학과 남민주.
시스템 생명 주기(System Life Cycle)(1/2)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
6장 트리.
알고리즘 강의 슬라이드 2 분할정복 강의 슬라이드 #2
시스템 생명 주기(System Life Cycle)(1/2)
쉽게 배우는 알고리즘 5장. 검색트리
CHAP 9 : 정렬.
자료구조 김현성.
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 7-2.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
교육수료증 재발급 사유서 SK하이닉스 이천안전팀 업체 명 : 담당자 (인) 업 체 명 : 이 름 : 서명
성탄절을 향한 길에서.
12 검색.
정렬과 합병.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
동적 계획(Dynamic Programming)
ETACS.
Ch.02 Divide and Conquer (분할정복)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
[CPA340] Algorithms and Practice Youn-Hee Han
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
5장 동적계획법 (Dynamic Programming)
센서값 전송하기 WiFi 시리얼 보드 활용가이드 김영준 헬로앱스 (
ST모드에서 데이터 읽기 및 제어하기 WiFi 시리얼 보드 활용가이드 김영준 헬로앱스 (
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
제5강 처리 장치 2.
고객님! 장수시대 필수 상품 준비하셨나요? 간 병 보 험 무배당 무배당 상품특징!! ~3등급 2 구분
C언어 응용 제 15 주 검색.
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
-Part1- 제7장 반복문이란 무엇인가.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
합병정렬(Merge Sort) (1/2) 문제: n개의 정수를 (비내림차순으로) 정렬하시오.
디지털회로설계_강의안5 7. 가산기와 감산기 회로.
CHAP 1:자료구조와 알고리즘.
2017학년도 학력인정 문해교육 운영 기관 현황 행정구별 기관수 현황 초등학력 프로그램 운영기관 중학학력 프로그램 운영기관
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
제 8 장 계산복잡도 개론 검색 문제 알고리즘 강의 슬라이드 8 검색 문제
알고리즘 강의 슬라이드 2 분할정복 제 2 장 분할정복 도경구역, 알고리즘, 사이텍미디어, 1999.
코딩체험교실 아두이노 로봇 코딩 4차산업기술 체험 (SW코딩/자율주행기술).
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
강의 #11 탐색(Search).
장 비 사 양 서 제품특징 제품사양 제조국 브랜드 KEVIC 모 델 M1636F 품 명 AUDIO MIXER
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
동영상 시청
K Nearest Neighbor.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
알고리즘(Algorithm) – Divide and Conquer (분할정복)
전류는 자계에서 힘을 받는다 기계공학교육 박지훈 황인석 한만혁 이덕균.
CONTENTS Part1. 조사 개요 / 3 1. 조사 목적 2. 조사 설계 3. 주요 조사 내용 4. 응답자 특성 5. 지수산출방법 Part2. 결과요약 및 제언 / 9 Part3. 조사결과 분석(만족도) / 종합 및 차원 만족도 2. 항목 만족도 3.
김진승 한국물리학회 교육위원장, 전북대학교 물리학과
알기쉽게 해설한 데이터구조 고 갑 승 한남대학교
房思琪的初恋乐园 ‘팡쓰치’로 보는 문학의 힘 정은비.
DataScience Lab. 박사과정 김희찬 (화)
Aggregated K-nearest neighbor queries for High – dimensional data Eojin Yun, Dept. of Computer Science and Engineering, POSTECH. Motivation 만약.
의사소통 이론의 이해 김연주 백정훈.
제3장 선교 구역.반장학교 제1단계.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Presentation transcript:

조 병 규 Software Quality Lab. 한 국 교 통 대 학 교 search 조 병 규 Software Quality Lab. 한 국 교 통 대 학 교

탐색을 예시하는 이유 탐색은 컴퓨터의 작업 중 가장 많이 사용되고 있는 작업 중의 하나인 중요한 문제이며 알고리즘의 개선과 선택의 문제에 대한 좋은 예일 뿐만 아니라 최악의 시간 복잡도와 평균 시간 복잡도에 있어서 최적의 하한 한계를 쉽게 추출할 수 있는 문제들 중의 하나이기 때문

순차 탐색에서의 시간 복잡도 int linearSearchClass::linearSearch() {     int position = 1;     while((position<=n) && (strcmp(x,List[position].name)))     {        position++;     }     if(position > n) position = 0;     return position; }; W(n) = max{t(1),t(2), . . . ,t(n)}             =  t(n)      =  n    B(n) = 1 x가 List의 첫 번째에 존재할 경우

순차 탐색에서의 평균 시간 복잡도 n+1 A(n) = ∑ p(Ii)t(Ii) i=1 n          =  ∑p(Ii)t(Ii) + p(In+1)t(In+1)              i=1             n           = ∑ (q/n) i + (1 - q)n               n          = (q/n) ∑ i + (1 - q)n               i=1   = (q/n) (n(n+1)/2) + (1 - q)n          = q(n+1)/2+ (1 - q)n x가 존재할 확률이 100%(q=1)인 경우 평균적으로 (1/2)n은 비교하여야 함 x가 존재할 확률이 50%(q=1/2)인 경우 평균적으로 (3/4)n은 비교하여야 함 x가 존재할 확률이 0%(q=0)인 경우 평균적으로 n번 비교하여야 함

순서화된 리스트에 대한 탐색 일반적 순차 탐색에 대하여 평균 탐색 시간 - q(n+1)/2 + (1-q)n 순서화된 리스트에 대한 탐색 일반적 순차 탐색에 대하여 평균 탐색 시간   - q(n+1)/2 + (1-q)n - 찾고자 하는 원소가 리스트 내에 반드시 존재할 경우 (1/2)n번 정도의 비교 - 존재할 확률이 50%일 경우 약 (3/4)n번 정도를 비교 리스트가 순차적으로 구성되었을 경우의 개선 방법은?   - 최악의 경우에 대한 시간 복잡도와 최선의 경우에 대한 시간 복잡도는 순차적으로 구성되어 있지 않을 때와 같음     - 그러나 평균 탐색 시간은 개선할 수 있음

순서화된 리스트에 대한 탐색 /*079*/ int linearSearchClass::linearSearch() /*080*/ { /*081*/ int position = 1; /*082*/ int i; /*083*/ /*084*/ while((position<=n) && (i=strcmp(x,List[position].name))) /*085*/ { /*086*/ if(i>0) position++; /*087*/ else position = n + 1; /*088*/ } /*089*/ if(position > n) position = 0; /*090*/ return position; /*091*/ }; W(n) = max{t(1),t(2), . . . ,t(n)}             =  t(n)      =  n    B(n) = 1 x가 List의 첫 번째에 존재할 경우

순서화된 리스트에 대한 평균 탐색 시간 g1 g2 g3 g4 gn-1 gn gn+1 값1 < 값2 < 값3 < .      .      . < 값n-2 < 값n-1 < 값n 값1 값2 값3 .      .      . 값n-2 값n-1 값n List [1] [2] [3] [n-2] [n-1] [n]   g1 g2 g3 g4 gn-1 gn gn+1   g1 = {a : a < List[1]}   gi = {k : List[i-1] < k < List[i] for i = 2,3,4,∙∙∙,n}   gn+1 = {z : z > List[n]}

순서화된 리스트에 대한 평균 탐색 시간 - x가 List 내에 존재할 확률 : q - 각 위치에 x가 존재할 확률 : p(i) = 1/n 일 경우 x가 List 내에 존재할 경우의 평균 탐색 시간은 다음과 같음             n n               A(n) = ∑ q(1/n)i  + ∑ (1-q)(1/(n+1))i  + (1-q)(1/(n+1))n              i=1  i=1                n n                         = q(1/n)∑ i  + (1-q)(1/(n+1))∑ i  + (1-q)(1/(n+1))n              i=1 i=1            = q(1/n)(n(n+1)/2)   + (1-q)(1/(n+1)) )(n(n+1)/2) + (1-q)(1/(n+1))n           = q(1/n)(n(n+1)/2)   + (1-q)(1/(n+1)) )(n(n+1)/2) + (1-q)(1/(n+1))n    = q((n+1)/2) + (1-q)(n/2) + (1-q)(1/(n+1))n 

순서화된 리스트에 대한 평균 탐색 시간 x가 존재할 확률이 100%(q=1)인 경우 평균적으로 약 (1/2)n은 비교하여야 함

순서화된 리스트에 대한 개선된 탐색 리스트가 순차적으로 구성되었을 경우의 개선 방법은? - 최선의 탐색 시간은 같으나   - 최선의 탐색 시간은 같으나 - 최악의 탐색 시간과 평균 탐색 시간은 개선 가능 - 개선 개념 : 비교 대상(원소)의 간격을 조정 값1 값2 값3 .      .      . 값n-2 값n-1 값n List [1] [2] [3] [n-2] [n-1] [n]

순서화된 리스트에 대한 개선된 탐색 비교 대상 원소 수 S1 = n 일 때 비교 간격을 g1로 설정하여 처리   ∘ 첫 번재  : x와  List[g1] 비교하여 찾는 원소가 아니면   ∘ 두 번째  : x와  List[2*g1] 비교하여 찾는 원소가 아니면                 ∙                 ∙       ∘ i  번째  : x와  List[i*g1] 비교 (i*g1≤n)함   따라서 g1으로 하였을 경우 시간 복잡도(비교수)는 ⌊n/g1⌋ 만약 x < List[i*g1] 이면 List[(i-1)*g1+1] < x < List[i*g1-1] (i=2,3,4,∙∙∙) 일 수 있음 비교 간격을 g2(<g1)로 설정하여 처리하였을 경우   ∘(i-1)*g1+1 < 비교범위 < i*g1-1 이고   ∘비교 대상 원소수 S2 = g1 - 1 이며   ∴ 비교수 = ⌊S2 / g2⌋ 따라서 x < List[i*gj] 이면 - List[(i-1)*gj+1]< x <List[i*gj-1] (i=2,3,4,∙∙∙)일 수 있음 - 비교 간격을 gj+1(<gj)로 설정하여 처리하였을 경우   ∘(i-1)*gj + 1 < 비교범위 < i*gj - 1 이고   ∘비교 대상 원소수 Sj = gj - 1 이며   ∴ 비교수 = ⌊Sj / gj⌋         그러므로 한 번 비교할 때 마다 대상에서 제외 되는 원소 수는 (i-1)gi이므로 최악의 경우에 대한 시간 복잡도와 평균 시간 복잡도를 개선할 수 있음.

(예) 순서화된 리스트에 대한 개선된 탐색 10 20 30 40 50 60 70 80 90 100 list [1] [2]   10 20 30 40 50 60 70 80 90 100 list [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 찾고자 하는 원소는 값이 75인 경우 (1) 첫 번째 처리 : g1을 4로 설정 - S1  = n(=10) - 1 ≤ 비교범위 ≤ 10 - 비교    i = 1 : x > List[4]    i = 2 : x > List[8]    ∴ t1(n) = 2 - 최대 비교수  = ⌊10 / 4⌋ = 2 (2) 두 번째 처리 : g2를 2로 설정 - S2  = 3 - 5 ≤ 비교범위 ≤ 7    i = 6 : x < List[6]  (i = [(t1 * g1) - g1] + g2)    ∴ t2(n) = 1 - 최대 비교수 = ⌊3 / 2⌋ = 1 (3) 세 번째 처리 : g3를 1로 설정 - S3  = 1 - 7 ≤ 비교범위 ≤ 7    i = 7 : x > List[7] (i = [(t1 * g1) - g1 + g2] + [(t2 * g2) - g2] + g3)   ∴t3(n) = 1 - 최대 비교수 = ⌊1/1⌋ = 1 ∴ t(n) = t1(n) + t2(n) + t3(n) = 2 + 1 + 1 = 4

이진 탐색 리스트의 원소들이 키 값의 크기 순서대로 일정하게 나열되어 있을 경우 대상 범위(전체, 또는 부분)에 대하여 중앙 위치의 원소들을 검사하여 해당 원소를 찾는 방법 따라서 한 번 비교할 때마다 대상 원소의 수가 반씩이 제외되므로 원소가 크기 순으로 정렬되었을 경우 가장 효율적인 방법 시간 복잡도 최악의 경우에 대한 시간 복잡도 W(n) =⌊lgn⌋+1 평균 시간 복잡도 A(n) = ⌊lgn⌋+(1/2)에 접근

이진 탐색 /*079*/ int binarySearchClass::binarySearch(int low, int high) /*080*/ { /*081*/ int mid; /*082*/ int mask; /*083*/ /*084*/ while(low<=high) /*085*/ { /*086*/ mid = (low + high) / 2; /*087*/ mask = strcmp(x,List[mid].name); /*088*/ if(mask == 0) return mid; /*089*/ else /*090*/ if(mask < 0) high = mid - 1; /*091*/ else low = mid + 1; /*092*/ }; /*093*/ return 0; /*094*/ }

이진 탐색의 최악의 경우 시간 복잡도 (1/4) (1) n = 1인 경우 low = 1, high = 1 ① x ≠ List(1).name 인 경우     low = 2, high = 1 또는 low = 1, high = 0     ∴ loop는 한 번만 수행됨 ② x = L(1).name 인 경우     return mid;     ∴ loop는 한 번만 수행됨  그러므로 x가 존재하든 안 하든 기본연산은 무조건 한 번은 수행됨

이진 탐색의 최악의 경우 시간 복잡도 (2/4) (2) n > 1인 경우 ① 첫 번째 처리     - 입력 크기 = n, low = 1, high = n     - x ≠ List(⌊(1+n)/2⌋).name일 경우       low = ⌊(1+n)/2⌋ + 1, high = n 또는 low = 1, high = ⌊(1+n)/2⌋ - 1     - 다음번 처리 대상의 크기       Ⓐ n이 짝수인 경우 low가 변하면 n/2, high가 변하면  n/2 - 1       Ⓑ n이 홀수인 경우 양쪽 모두 (n-1)/2       ∴ ⌊n/2⌋개의 원소수가 처리 대상임 ② 두 번째 처리     - 입력의 크기 :⌊n/2⌋        다음 번 처리 대상의 크기 : ⌊⌊n/2⌋/2⌋        ∴ ⌊n/22⌋ .

이진 탐색의 최악의 경우 시간 복잡도 (3/4) ⓘ i 번째 처리 - 입력의 크기 :⌊n/2i-1⌋    - X ≠ L(⌊(1+n)/2⌋).name일 경우  다음 번 처리 대상의 크기 : ⌊n/2i⌋    그러므로 이진 탐색에서의 최악의 경우에 대한 시간 복잡도  ① W(1) = 1  ② W(n) = 1 + W(⌊n/2⌋),   (n > 1에 대하여)

이진 탐색의 최악의 경우 시간 복잡도 (4/4) ① W(1) = 1 ② W(n) = 1 + W(⌊n/2⌋),   (n > 1에 대하여) 여기서 W(n)을 확장해 보면 다음과 같음 W(n) = 1 + W(⌊n/2⌋)      = 2 + W(⌊n/22⌋) <=== 1 + (1+W(⌊n/22⌋)       = 3 + W(⌊n/23⌋) <=== 2 + (1+W(⌊n/23⌋)       = 4 + W(⌊n/24⌋) <=== 3 + (1+W(⌊n/24⌋)              ∙       = i + W(⌊n/2i⌋) 위에서 W(⌊n/2⌋)는 순환(재귀) 관계에 있는 것이므로 W(⌊n/2i⌋) = W(1)도 성립 따라서    n / 2i = 1   ⇨  n = 2i   ⇨  i = lgn    lgn은 정수가 아닐 수 있으므로 ⌊lgn⌋으로 수정하면    W(n) = 1 + ⌊lgn⌋,  (n ≥ 1에 대하여)

이진 탐색의 평균 시간 복잡도 (1/4) 산출을 위한 정의 ∘ n : 입력 크기 ∘ Dn : 고려될 수 있는 문제의 입력 크기 n의 집합 ∘ I  : Dn의 원소  ∘ P(I) : ∙입력 I의 발생 확률 ∘ q : x가 List에 있을 확률 ∘ 1 ≤ i ≤ n에 대하여    Ii : x = List[i] 인 모든 키 값들(모든 입력) ∘ 2 ≤ i ≤ n에 대하여    In+i :  List[i-1] < x < List[i]인 키 값들로 가정하면    In+1 :  x < List[1]인 키 값들    I2n+1 :  x > List[n]인 키 값들 ∘ t(Ii) = 입력 Ii상에서 수행된 연산의 수 ∙ x가 가질수 있는 위치의 수 : 2n +1   ∵ x가 List에 존재할 경우의 위치 수 = n        x가 List밖에 존재할 경우의 위치 수 = n + 1

이진 탐색의 평균 시간 복잡도 (2/4) x가 가질수 있는 위치의 수 : 2n +1 ∵ x가 List에 존재할 경우의 위치 수 = n      x가 List밖에 존재할 경우의 위치 수 = n + 1 산출을 위한 가정  (1) 1 ≤ i ≤ 2n+1에 대하여  모든 위치(간격 포함)들은 거의 같음  (2) 어떤 정수 k ≥ 1에 대하여 n = 2K - 1 - 두 번째 가정(2)은 기본연산의 수행 수(k)와 입력 크기(n)와의 관계를 나타냄 - k = ⌊lgn⌋ + 1이면 최악의 경우에 대한 시간 복잡도임

이진 탐색의 평균 시간 복잡도 (3/4) 1≤t≤k에 대하여 St : 기본 연산을 t번 수행하는 입력 크기 Sk = 2k + n + 1           k A(n) = ∑(1/(2n+1))t St              t=1                   k      = 1/(2n+1)∑ t St              t=1                                                          k      = 1/(2n+1)[∑ t2t-1 + k(n+1)]          t=1      = 1/(2n+1)[∑ t2t2-1 + k(n+1)]                   k      = 1/(2n+1)[(1/2)∑ t2t + k(n+1)]          t=1 [참고]   k  ∑ t2t = (k-1)2k+1+2 t=1 = 1/(2n+1)[(1/2)((k-1)2k+1+2) + k(n+1)] = 1/(2n+1)[((k-1)2k+1) + k(n+1)] = ((k-1)2k+1)/(2n+1) + k(n+1)/(2n+1)

이진 탐색의 평균 시간 복잡도 (3/4) n = 2K-1 = ((k-1)2k+1)/(2(2K-1 )+1) + k((2K-1 )+1)/(2(2K-1 )+1) = ((k-1)2k+1)/(2K+1-1 ) + k2K/(2K+1-1 ) = ((k-1)2k+1+ k2K) / (2K+1-1 ) = (k2k-2K+1+k2K) / (2K+1-1 ) = (2k2k-2K+1) / (2K+1-1 ) = ((2k-1)2k+1) / (2K+1-1 ) = ((2k-1)2k+1) / (212K-1 ) ≒ (2k-1) / 2 = k - (1/2) = (⌊lgn⌋+1) – (1/2) ∴ A(n) = ⌊lgn⌋  +  1/2

  (예) 이진 탐색   10 20 30 40 50 60 70 80 90 100 110 120 130 list [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] 비교수  3 4 2 1 9 이하   11 ~ 19 21 29 31 39 41 49 51 59 61 69 71 79 81 89 91 99 101 109 111 119 121 129 131 이상 g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 g11 g12 g13 g14 [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] 3 4

(예) 이진 탐색 list [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]   (예) 이진 탐색 list [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]   10 20 30 40 50 60 70 80 90 100 110 120 130 [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 g11 g12 g13 g14 9 이하   11 ~ 19 21 29 31 39 41 49 51 59 61 69 71 79 81 89 91 99 101 109 111 119 121 129 131 이상 원소위치(i) 비교 수(t(Ii))        1   3        2   4        3   2        4          5          6          7   1        8          9         10       11       12       13   원소위치(i) 비교 수(t(Ii))    14(g1)  3    15(g2)   4    16(g3)      17(g4)      18(g5)      19(g6)      20(g7)      21(g8)      22(g9)      23(g10)     24(g11)     25(g12)     26(g13)     27(g14)