11.07.2015 Views

PDF(2)

PDF(2)

PDF(2)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

알고리즘 INA280 NOTE02분할정복법 I인터넷미디어공학부김상진1교육목표• 분할정복법문제의 사례를 2개이상의더작은사례로나누어각작은사례에대한해답을 쉽게 얻을 수 있으면 이들의 해답을 결합하여 원 문제의 해답을얻는 방식• 문제를 나누는 과정은 해답을 쉽게 얻을 때까지 반복적으로적용한다.• 작은 사례는 보통 원 문제와 같지만 작은 규모이다.• 하향식(top-down) 접근 방법• 보통 재귀 프로시저로 먼저 해결한 다음에보다 효율적인 반복 프로시저가 없는지검토한다.2/341


재귀 반복• 꼬리재귀: 메소드 내에 재귀 호출이 하나 밖에 없으며, 이호출이메소드의 마지막 문장인 경우• 종료 조건이 되면 반복이 종료되는 반복문을 이용하여 쉽게재귀를 제거할 수 있음• 꼬리재귀가 아니면 쉽게 바꿀 수 없다.꼬리재귀재귀할 이유가없어 보인다.7/34재귀 반복• 꼬리재귀를 반복으로 바꾸는 예boolean search(Comparable item, int start){if(item.compareTo(element[start])==0)return true;else if(start==size-1)return falseelse return search(item, start+1);}boolean search(Comparable item){int loc = 0;boolean found = false;while(loc


이진검색 – 최악의 경우 분석• 함수 호출마다 x와 S[mid]가 같지 않으면 두 번 비교가 필요하다.• 그러나 실제 이것이 기계어로 표현되면 한번으로 최적화될 수 있다.• 오름차순으로 정렬된 배열에 대한 이진검색에서 최악의 경우는 찾고자하는 x가 배열에 있는 모든 원소보다 클 경우이다.01234567891011121314154321 2 3 4 5• n이 2의 거듭제곱이면 그것의 반은 항상 짝수이다.• 그러므로 최악의 경우 재귀 호출마다 n의크기정확하게n/2로감소한다.9/34이진검색 -계속• 따라서 다음과 같은 재현식(recurrence equation)을얻는다.nW( n) = W ⎛ ⎜⎞ + 12⎟ ⎝ ⎠재귀호출에서비교 횟수최상위 레벨에서비교횟수재현식의 해n이 2의거듭제곱으로제한되면W(n) = lgn+1n이 2의거듭제곱으로제한되지않으면W(n) = ⎣lgn⎦+1 ∈Θ(lgn)10/345


합병정렬(MergeSort)• 쌍방 합병(two-way merging): 같은 순으로 정렬되어 있는 두 개의배열을 정렬된 하나의 배열로 만드는 과정• 합병을 반복적으로 적용하여 배열을 정렬할 수 있다.• 합볍 정렬의 절차• 분할: 배열을 n/2개의 요소로 구성된 2개의 부분배열로 분할한다.• 정복: 각 부분배열을 정렬한다.• 통합: 정렬된 각 부분배열을 하나의 정렬된 배열로 합병한다.27 10 12 20 25 13 15 2227 10 12 20 25 13 15 2210 12 20 27 13 15 22 2510 12 13 15 20 22 25 2711/34합병정렬 알고리즘• 문제: n개의 키를 오름차순으로 정렬• 입력: 양의 정수 n, 오름차순으로 정렬된 배열 S[0..n-1]• 출력: 오름차순으로 정렬된 배열void mergeSort(int n, keytype S[]){if(n>1){int h = ⎣n/2⎦, m = n-h;keytype U[0..h-1], V[0..m-1];copy S[0..h-1] to U[0..h-1];copy S[h..n-1] to V[0..m-1];mergeSort(h, U);mergeSort(m,V);merge(h, m, U, V, S);}}12/346


합병 알고리즘• 문제: 오름차순으로 정렬되어 있는 두 개의 배열을 하나의 정렬된 배열로 합병• 입력: 양의 정수 h와 m, 오름차순으로 정렬된 배열 U[0..h-1]와 V[0..m-1]• 출력: 오름차순으로 정렬된 배열 S[0..h+m-1]void merge(int h, int m, keytype S[], keytype V[], keytype S[]){index i = 0, j = 0, k = 0;while(i


합병정렬 알고리즘 – 최악의 경우 분석• 기본연산: merge에서 일어나는 비교 연산• 입력크기: n, 배열 S의크기• 재현식: W( n) = W( h) + W( m) + h+ m−1U를 정렬하기위한 비교횟수V를 정렬하기위한 비교횟수합병의비교횟수• n이 2의 거듭제곱이면 h = m = n/2W( n) = W( n/2) + W( n/2) + n− 1= 2 W( n/2) + n− 1,kn> 1( n=2 )W (1) = 0재현식의 해n이 2의거듭제곱으로제한되면W(n) = nlgn-(n-1) ∈Θ(nlgn)n이 2의거듭제곱으로제한되지않으면W(n) = W( ⎣n/2⎦) + W(⎡n/2⎤) + n -1 ∈Θ(nlgn)15/34재현식의 해 구하기• 재귀 알고리즘의 분석은 반복 알고리즘보다 어렵다.• 하지만 재귀 알고리즘은 재현식을 이용하여 분석 가능하다. 그러나재현식의 해를 어떻게 구하는지 알아야 시간복잡도를 구할 수 있다.16/348


귀납법을 이용한 재현식의 해 구하기• 예2.1)계승 함수int fact(int n){if(n==0) return 1;else return n * fact(n-1);}• 이 알고리즘에서 수행하는 곱셈의 회수• t n : n이 주어졌을 때 수행하는 곱셈의 회수t n = t n-1 + 1이와 같은 형태의 식을 재현식이라 한다.• n에대한함수값을n보다 작은 값에대한함수값의형태로나타나기 때문에 재현식이라 한다.• 재현식에는 초기조건(initial condition)이라고하는출발점이있어야 한다. 예) 계승 함수: t 0 = 017/34귀납법을 이용한 재현식의 해 구하기 – 계속• 초기조건을 이용하여 반복적으로 계산함으로써 큰 n 값에 대한 t n 을계산할 수 있으나, 바로 t n 을 계산할 수는 없다.• t 1 = 0+1 = 1, t 2 = 1 + 1 = 2, t 3 = 2 + 1 = 3, …• 바로 t n 을계산할수있도록t n 을 명백한 식으로 나타낸 것을 재현식의해(solution)이라 한다.• 위에서몇개값을조사한바에의하면t n = n이다.• 이것을 귀납법으로 증명하면 다음과 같다.• 귀납출발점: n = 0, t 0 = 0;• 귀납가정: t n = n• 귀납절차: t n+1 = t n + 1이므로 귀납가정에 의해 t n+1 = n+1이다.18/349


귀납법을 이용한 재현식의 해 구하기 – 계속• 예2.2)다음 재현식의 해를 구해보자.t n = t n/2 +1 n>1, n은 2의 거듭제곱으로 표현되는 수t 1 = 1• 처음몇항의값은• t 2 = t 2/2 +1 = t 1 +1 = 1+1 = 2• t 4 = t 4/2 +1 = t 2 +1 = 2+1 = 3• t 8 = t 8/2 +1 = t 4 +1 = 3+1 = 4• 일반항은 t n = lgn+1?• 귀납출발점: t 1 = 1 = lg1 + 1• 귀납가정: t n = lgn+1• 귀납단계: t 2n = t (2n)/2 +1 = t n +1 = lgn+1+1 = lgn+lg2+1 = lg(2n)+119/34특성식을 이용한 재현식의 해 구하기• 동질 1차재현식• k와 a i 항이 상수일 때, 다음 형태의 재현식은 상수계수 동질 1차재현식이라 한다.a 0 t n + a 1 t n-1 + … + a k t n-k = 02• 1차: tn − i와같은항이없기때문에• 동질(homogeneous): 항들의 1차조합이0이되기때문에• 예2.3)피보나찌 수열• t 0 = 0, t 1 = 1, t n = t n-1 + t n-2 , n≥2• t n - t n-1 - t n-2 = 020/3410


특성식을 이용한 재현식의 해 구하기 -계속• 정리 2.1에서 특성식의 k 근은 모두 달라야 한다. 즉, 정리는 다음과같은 형태의 특성식을 허용하지 않는다.(r-1)(r-2) 3 = 0• 정리 2.2. r을상수계수동질1차재현식의특성식의m번 중복된근이라고 하자. 그러면다음은모두재현식의해가된다.t n = r n , t n = nr n , t n = n 2 r n , …, t n = n m-1 r n따라서 이 해들의 항은 각각 재현식의 일반해에 포함된다.23/34특성식을 이용한 재현식의 해 구하기 -계속• 예2.5)다음 재현식의 해를 구해보자.t 0 = 0, t 1 = 1, t 2 = 2, t n -7t n-1 + 15t n-2 -9t n-3 = 0, n≥2• 이 재현식의 특성식은 다음과 같다.r 3 -7r 2 + 15r –9 = (r-1)(r-3) 2 = 0• 정리 2.2를 적용하면 재현식의 해는 다음과 같다.t n = c 1 1 n + c 2 3 n + c 3 n3 n• 초기조건을위식에적용하면c 1 + c 2 = 0c 1 + 3c 2 + 3c 3 = 1c 1 + 9c 2 + 18c 3 = 2위 연립방정식의 해를 구하면 c 1 = -1, c 2 =1, c 3 = -1/3이다.• 따라서 재현식의 해는 다음과 같다.t n = -1 + 3 n - n3 n-124/3412


특성식을 이용한 재현식의 해 구하기 -계속• 비동질 1차재현식• k와 a i 항이 상수이며 f(n)이 영함수(zero function)가아닐때, 다음형태의 재현식은 상수 계수 비동질 1차재현식이라한다.a 0 t n + a 1 t n-1 + … + a k t n-k = f(n)• 예2.6)다음 재현식의 해를 구해보자.t 0 =0, t 1 =4, t n -3t n-1 = 4 n , n>1• 4 n 때문에 비동질이다. 따라서 이 항을 제거하면 이전 처럼 재현식의해를 구할 수 있다.• n을 n-1로 대체하면, t n-1 –3t n-2 = 4 n-1• 원식을4로 나누면, t n /4 – 3t n-1 /4 = 4 n-1• 위 두 식을 결합하면 다음과 같은 재현식을 얻을 수 있다.t n /4 – 7t n-1 /4 + 3t n-2 = 0t n –7t n-1 + 12t n-2 = 025/34특성식을 이용한 재현식의 해 구하기 -계속• 정리 2.3. 다음 형태를 가진 비동질 1차 재현식은a 0 t n + a 1 t n-1 + … + a k t n-k = b n p(n)• 다음과 같은 특성식을 가진 동질 1차 재현식으로 바꿀 수 있다.(a 0 r k + a 1 r k-1 + … + a k r 0 )(r-b) d+1 = 0여기서 d는 p(n)의 차수이다. 이 특성식은 다음과 같은 두 부분으로구성되어 있다.• 동질 재현식에 대응하는 특성식• 재현식의 비동질 부분에서 얻어낸 항우변에 b n p(n)과같은항이2개이상있다면이들각항은특성식의한항을만드는데각각기여한다.26/3413


• 비동질 부분: (1) n n 1 +2 n n 0 (r-1) 2 , (r-2) 1특성식을 이용한 재현식의 해 구하기 -계속• 예2.7)다음 재현식의 해를 구해보자.t 0 = 0, t 1 = 12, t n -3t n-1 = 4 n (2n+1), n>1• 대응되는 동질 재현식의 특성식: r-3 = 0• 비동질 부분: (r-b) d+1 = (r-4) 2• 특성식: (r-3)(r-4) 2 =0을 이용하여 해를 구한다.t n = c 1 3 n +c 2 4 n +c 3 n4 n• 초기 조건이 두 개만 주어져 있기 때문에 미지수 3개를구할수없다.따라서 재현식을 이용하여 t 2 를 계산한 다음에 이것을 이용한다.27/34특성식을 이용한 재현식의 해 구하기 -계속• 예2.8)다음 재현식의 해를 구해보자.t 0 = 0, t n -2t n-1 = n+2 n , n>1• 대응되는 동질 재현식의 특성식: r-2 = 0• 특성식: (r-1) 2 (r-2) 2 =0을이용하여해를구한다.t n = c 1 1 n +c 2 n1 n +c 2 2 n +c 4 n2 n• 초기 조건이 한 개만 주어져 있기 때문에 미지수 4개을구할수없다.따라서 추가적인 초기 조건을 계산한 다음에 해를 구한다.28/3414


변수의 변경을 이용한 재현식의 해 구하기• 예2.9)다음 재현식의 해를 구해보자.T(1) = 1, T(n) = T(n/2)+1, n>1• 귀납법으로 이 재현식의 해는 이미 구했다. 하지만변수변경기법을이용하여 다시 구해본다.• n = 2 k 로 설정하여 재현식을 다시 표현하면T(2 k ) = T(2 k /2)+1 = T(2 k-1 )+1• t k = T(2 k )로 설정하면 다음과 같은 새 재현식을 얻게 된다.t k = t k-1 + 1• 위 재현식은 정리 2.3을 이용하여 해결할 수 있다. (r-1) 2 = 0t k = c 1 +c 2 k• t k = T(2 k )이므로위식은T(2 k ) = c 1 +c 2 k와같다.• 2 k 는 n으로, k는 lgn으로 치환하면 T(n) = c 1 +c 2 lgn과같다.• 이식에초기조건을이용하여미지수를계산할수있다.29/34치환을 이용한 재현식의 해 구하기• 예2.10)다음 재현식의 해를 구해보자.t 1 = 1, t n = t n-1 + n, n>1• 치환은 귀납의 반대되는 개념이다. 즉, n에서 시작하여 거꾸로 진행t n = t n-1 + nt n-1 = t n-2 + n –1t n-2 = t n-3 + n –2t 2 = t 1 + 1t 1 = 1t n = t n-1 + nt n = t n-2 + n –1 + nt n = t n-3 + n –2 + n –1 + nt n = t 1 + 2 + … + n -1 + nt n = 1 + 2 + … + n -1 + ntnn∑= i =i=1nn ( + 1)230/3415


모든 n으로 확장하기• 보통 재귀 알고리즘은 n이어떤밑수 b의 거듭제곱인 경우에만정확하게 시간 복잡도를 구할수있다.• 분할정복 알고리즘은 더욱그렇다.• n이어떤밑수b의 거듭제곱인경우에 성립하는 결과는 모든n에대해서도보통근사적으로성립한다.엄격히증가하는감소하지않는 함수가아닌 경우감소하지않는결국감소하지않는31/34모든 n으로 확장하기 – 계속• 시간 복잡도 함수는 보통 감소하지 않는 함수이다.• 입력의 크기가 증가함에 따라 보통 소요되는 시간은 증가하기때문이다.• 보통 감소하지 않는 함수이면 모든 n으로 확장할 수 있다.• 보다 정확하게 말하면 궁극에 감소하지 않는 함수이면 분석을 모든n으로 확장할 수 있다.• 정의 2.1. 복잡도 함수 f(n)이 궁극에 감소하지 않는 함수이고, 다음을만족하면 이 함수는 매끄러운(smooth) 함수라 한다.f(2n) ∈Θ(f(n))• lgn은 매끄러운 함수이다.lg(2n) = lg2 + lgn ∈Θ(lgn)• 2 n 은 매끄러운 함수가 아니다.2 2n = 4 n ∉Θ(2 n )32/3416


모든 n으로 확장하기 – 계속• 정리 2.4. b(≥2)는 정수이고, f(n)은 매끄러운 복잡도 함수이며, T(n)은결국에는감소하지않는복잡도함수라하자. 만약 n이 b의거듭제곱일때 T(n) ∈Θ(f(n))이 성립하면 모든 n에대해T(n) ∈Θ(f(n))이성립한다.• 이 정리는 O, Ω, o에 대해서도 성립한다.• 예2.11)다음과같은재현식을고려해보자.T(1) = 1, T(n)= T(⎣n/2⎦)+1, n>1• n이 2의 거듭제곱이면 다음이 성립한다.T(n) = lgn+1 ∈Θ(lgn)• lgn은 매끄러운 함수이므로 모든 n에대해서위식이성립함을보이기 위해서는 T(n)이 결국 감소하지 않는 함수임을 보여야 한다.• 그러나 우리는 n이 2의 거듭제곱이면 T(n) = lgn+1이라는것밖에모르기 때문에 T(n)이 2의 거듭제곱값들 사이에서 어떤 결과를보일지 장담할 수 없다.33/34모든 n으로 확장하기 – 계속• 귀납법으로 T(n)이 결국 감소하지 않는다는 것을 증명한다.• 귀납출발점: n = 2,T(1) = 1, T(2) = T(⎣2/2⎦)+1 = 2이므로 T(1)≤T(2)이다.• 귀납가정: 모든 m≤n에대해k

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!