: 2 = 3 4? 0 an ordered set of unambiguous, executable steps that produces a result and terminates in a finite time (computational theory) ( ) 5 6 (C-) int min, max; float degree, b; char ch, token; /,,, min = 0; degree = a + b; while (age <= adult) for (i=; i < n; i++) 8
(C-) if ( age > adult ) else 2 int num[0]; Power (x, n) p=; for (i=; i<=n; i++) p = p * x; return (p); printf( Power (2, 5) ); 9 0 + 2 [] [0] [] [2] [3] [4] [5] [6] [0] [] [2] [3] [4] [5] [6] head 62 24 80 0 head 62 5 80 24 2 4 0 5 62 80 3 4 D C top T T n T, T 2 T n. T T2 T 3 C D T 3 C D E Head/Front Tail/Rear T E F G H I J K L M N T 2 T T 32 6
2 degree leaf ( terminal ), noterminal parent, child, sibling C ancestor, descendant degree,, height/ depth forest D E C C C ordered tree 8 C C C D E F G H I J K D H I E J K F G L M N O D E H I F J K G perfect full C C C D E F G D E F G D E F G H I J complete N O balanced 9 H I J K 20 G=(V,E) V :, E : (,2) = (2,) 3 <,2> > 2 5 3 E 2 3 4 C C 4 adjacent, incident subgraph path, length degree in-degree, out-degree simple path, cycle, loop connected strongly connected 2 2 3 4 0 3 2 4 2 3 0 3 2 0 5 4 4 5 0 3 2 2 4 3 5 4 head[] 2 3 4 2 3 3 2 4 4 3 4 2 4 5 4 2 3 5 23 24
: : 2 ( ) [0] [] [2] [3] [4] [5] [6] [] [0] [] [2] [3] [4] [5] [6] [] 2? 25 26 K. K! SequentialSearch ([], n, x) // : [..n] x // : i i = ; 2 while ( i <= n && [i]!= x ) 3 i = i + ; 4 return (i); 2 28 J inarysearch ([], key, left, right) // [mid]=key mid mid = (left + right)/2; 2 if ([mid] = key) return(mid); 3 else if ([mid] > key) inarysearch(, key, left, mid-) 4 else inarysearch(, key, mid+, right); 29 greedy divide-and-conquer dynamic programming. 2(, ), 3( ) 3 32
4. 6. (, )., 4.,, 34 2 3,,,?. T : 0, 00,, 0, 5, 80 0 20 0 0 0 0 0 0 0 0 0 35 36 M w i p i n p = w = 3 p 2 = 20 w 2 = 5 M=0 n=4 p 3 = 9 w 3 = 3 p 4 = 4 w 4 = 4 3 38 0/ M = 0, n = 4 (p, p 2, p 3, p 4 ) = (, 20, 9, 4) (w, w 2, w 3, w 4 ) = (3, 5, 3, 4) M = 0, n = 4 (p, p 2, p 3, p 4 ) = (, 20, 9, 4) (w, w 2, w 3, w 4 ) = (3, 5, 3, 4) ( ) p p2 p3 p 4,,, w w2 w3 w4 (5, 4, 3, 3.5) = p + p 2 + p 4 = 42 p w p, w p, w p, w 2 3 4 2 3 4 (5, 4, 3, 3.5) = p + p 2 = 35 = p + p 3 + p 4 = 38 39
, space complexity (= + ) time complexity 4 42 = () 43 f(n) :,, ( n) P( I) t( I) W IS n ( n) mint( I) IS n ( n) max t( I) : I Sn S n : n P(I) : I t(i) : I Sumverage([0..n-], n) sum = 0; 2 while ( i < n ) n+ 3 sum = sum + [i]; n 4 i = i + ; n 5 mean = sum / n; T(n) = 3n+3 O(n) 45 46 n n=5 n=0 n= 0n+9 n 2 /2+3n 59 09 9 2.5 80.5 - c n 0 0 c g(n) f(n)=o(g(n)). cg(n) f(n) n=6 69 6 n=20 209 260 n 0 4 48
2-3 - c n 0 0 c g(n) f(n)=(g(n)). f(n) cg(n) c, c 2 n 0 0 c 2 g(n) f(n)=(g(n)). c 2 g(n) f(n) c g( n) n 0 n 0 49 f(n)=3n+3, g(n)=n n f(n)=o(g(n))=o(n) n 3n+ n f(n)=(g(n))=(n) f(n)=o(n) and f(n)=(n) f(n)=(n) f(n)=2n 3 +3n 2 -n+0, g(n)=n 3 n>5 2n 3 +3n 2 - n 3 f(n)=o(n 3 ) n>3 2n 3 +3n 2 - n 3 f(n)=(n 3 ) f(n)=o(n 3 ) and f(n)=(n 3 ) f(n)=(n 3 ) O() O(logn) O(n) O(nlogn) O(n 2 ) O(n 3 ) O(2 n ) O(n!) 0n+9 n 2 /2+3n O(n) O(n 2 ) 5 52 logn n nlogn n 2 n 3 2 n 0 0 2 2 2 4 8 4 2 4 8 6 64 6 () 2 n n 3 n 2 nlog 2 n 3 8 24 64 52 256 n 4 6 64 256 96 636 5 32 60 024 3268 429496296 log 2 n 2 4 8 6 32 64 28 (n) 53 54 ( ) f(n) f(n)=o(g(n)) g(n) g(n) i = ; while (i <= n) x = x + ; i = i + ; int i, j; for (i=; i<=n; i++) for (j=; j<=n; j++) if ( j > i) 3n+2 O(n) O(n 2 ) C[i,j] = [i]*[j]; 56
inarysearch ([], key, left, right) mid = (left + right)/2; 2 if ([mid] = key) return(mid); 3 else if ([mid] > key) inarysearch(, key, left, mid-) 4 else inarysearch(, key, mid+, right); 5 58 (), () T( n) T ( n ) (), (), (2) T( n) T( n ) ( n), (), (3) T( n) T ( n / 2) (), (), (4) T( n) T ( n / 2) ( n), (), (5) T( n) 2T ( n / 2) (), (), (6) T( n) 2T ( n / 2) ( n), n n 2 n n 2 n n 2 n n 2 n n 2 n n 2 T( n) ( n) 2 T( n) ( n ) T( n) (log n) T( n) ( n) T( n) ( n) T( n) ( nlog n) 59 60 2?, 3 4
(stable) ( ),, (in-place) 5 6 [ ] n 0 n- [i-) if i < j then [ii,j-) n [0..n-] 8 20 45 5 35 25 0 (n-)? N Y 9 0 0 20 35 5 0 45 25 5 20 35 0 45 25 2 5 0 35 20 45 25 3 5 0 35 20 45 25 4 5 0 20 35 45 25 5 5 0 20 25 35 45 6 5 0 20 25 45 35 5 0 20 25 35 45 8 5 0 20 25 35 45 9 5 0 20 25 35 45 SelectionSort (int [], int n) for (i = 0; i < n; i++) Min = i; // for (j = i+; j < n; j++) // if ([j] < [Min]) Min = j; // [i] [Min] // [0:i] 2
O(n 2 ) n( n ) : ( n ) ( n 2) 2 5 25 5 25 3 4 20 35 5 0 45 25 20 35 5 0 45 25 20 35 5 0 45 25 20 35 5 0 45 25 20 5 35 0 45 25 20 5 35 0 45 25 5 20 35 0 45 25 5 20 35 0 45 25 0 20 35 5 0 45 25 5 20 35 0 45 25 2 5 0 20 35 25 45 3 5 0 20 35 25 45 4 5 0 20 25 35 45 5 5 0 20 25 35 45 6 5 0 20 25 35 45 5 0 20 25 35 45 8 5 0 20 25 35 45 9 5 0 20 25 35 45 6 _ ubblesort (int [], int n) for (i=n-; i>0; i--) for (j=n-; j>0; j--) if ([j-] > [j]) [j-] [j] _2 ubblesort (int [], int n) OUND = -; do top = n; for (j=top-; j>ound; j--) if ( [j] < [j-] ) [j] [j-] top = j; OUND = top; // [0:top-] while ( top < n ); 8 3 5 9 : O(n) 9 5 3 : O(n 2 ) 9 20
, 20 45 5 25 35 0 2 5 20 0 20 35 5 0 45 25 20 35 5 0 45 25 2 20 35 5 0 45 25 3 20 35 5 0 45 25 4 5 20 35 0 45 25 5 5 0 20 35 45 25 6 5 0 20 35 45 25 5 20 5 0 20 35 45 25 8 5 0 20 25 35 45 9 5 0 20 25 35 45 23 24 InsertionSort (int [], int n) for (i=0; i<n; i++) for (j=i; j>0 && [j] < [j-]; j--) [j] [j-] 3 5 9 9 5 3 : O(n) : O(n 2 ) // [0:i] 25 26 2 28
Donald L. Shell / / 6/2 = 8 8 8 29 _ 8/2 = 4 _ 4/2 = 2 3 32 _ 2/2 = ShellSort (int [], int n) for ( D= n/2; D > ; D= D/2 ) for (i=d; i < n; i++) for (j=i; j >= D && [j] < [j-d]; j=j-d) [j] [j-d] // D 34 O(n 2 ) O(nlogn), D D n/2 i (n=, i=, 2, 3, : D k, D k-,, D < i < k, D i- < D i < D i+ i < j D j D i D =, 4, 3,, 2, 364, 093, 3280, (D i+ =3D i +, D =) (Sedgewick) (Papernov-Stasevic) 35 36
D (D k D k- D ) D 45 45 45 3 2 3 [ ] 23 2 2 24 34 3 3 25 29 35 39 C[ ] [ ] 4 5 8 9 4 8 9 26 2 3 36 3 4 6 0 6 20 28 32 38 42 2 43 45 4 5 _MergeSort() _Merge() Merge ([ ], [ ], n, m) MergeSort ([ ], n) if (n <= ) return; MID = n/2; [0 : MID-] = MergeSort ([0 : MID-], MID); [MID : n] = MergeSort ([MID : n], n-mid); C[0 : n-] = Merge ([0 : MID-], [MID : n], MID, n-mid); return C[0 : n-]; i = j = k = 0; while ( i<n && j<m ) if ( [i] <= [j] ) C[k++] = [i++]; else C[k++] = [j++]; for ( ; i<n; i++) C[k++] = [i]; for ( ; j<m; j++) C[k++] = [j]; return C[0 : n+m-]; 6
Merge() [] + [] C[0:n-] (n) MergeSort(), (C[0:n-]) T(n)=(nlogn) 8 9 n n/2 O(n) C[0:n-] 0 20 35 5 45 0 25 20 35 5 0 45 25 20 35 5 0 45 25 5 0 20 35 45 25 5 0 20 25 35 45 2 3, (pivot) ( ) O(nlogn) O(n 2 ) < < 4
i x >= x < i j j i j i j j i 6 _() i j i j i i j j i j 8 9 _(2) _QuickSort() QuickSort ([ ], n) if (n <= ) return; PIVOT = Partition ([0 : n-], n); QuickSort ([0 : PIVOT-], PIVOT); QuickSort ([PIVOT+ : n-], n-pivot-); return [0 : n-] 20 2 _Partition() Partition ([ ], n) i=; j=n-; while ( i < j ) while ( [i] < [0] && i < n ) i++; while ( [j] >= [0] && j > 0 ) j--; if ( i < j ) [i] [j] else [0] [j] // return j; Partition() (n) i j i j 23
_() QuickSort() T( n) T( ) T( ) ( n) T() () n- 2 n-2 3 n-3 4 n-4 _(2) 3 5 9 9 5 3 : n- 3 5 9 5 3 9 3 5 9 5 3 9 3 5 9 3 5 9 3 5 9 3 5 9 n/2-... n/2+ 3 5 9 3 5 9 n n/2 n/2, 24 25 _(3) _(4), / n/2 : n/2 20 35 25 0 5 0 5 20 25 35 5 0 20 25 35 5 0 20 25 35 log 2 n T(n)=(n 2 ) () 26 2 _(5) T( n) T( n / 2 ) T( n / 2 ) ( n), T() () _(6) O(nlogn) T(n)=(nlogn) 28 29 O(n 2 ) O(nlogn) 3
25 20 25 20 i j 25 20 j i 20 25. 2. 3. 4. 5. 6.. NP- 8. 9. 2. (I) 3. (II), 4. (III),, 32 2 (heap) (). ( 0 6 0 2 3 4 25 35 3 6 6 25 6 9 2 4 0 20 2 3 4 2 3 0 4 9 5 20 6 8 3 8 9 0 8 5 0 0 i 2i+2 2i+ 0 2 3 4 5 6 8 9 0 0 9 20 8 3 8 5 0 j 2. 2. ( ) 5 6
95 95 95 95 95 95 8 2 i = (n-) to Y N 2 2 & 9 0 _ (heap), 2 ( ) 2 () 3 4
(2) (3) 6 (4) (5) 8 (6) () 9 20 (8) 2
_2 _2 _() 23 24 _2 _(2) _2 _(3) 25 26 _2 _(4) _2 _(5)_ 2 28 () 29
_(2) _(3) 3 32 _(4) _(5) 34 _(6) _() 35 36 _(8) _(9) 3 38
_(0) _() 39 _(2) _(3) 4 42 _(4) _() 43 _,, O(nlogn) 45 46
O(n), 4 48 6 8 9 6 8 6 0 5 8 6 0 9 5 6 8 6 : COUNT[ [i] ]++ : 5~0 COUNT 5 6 8 9 0 0 0 0 0 0 0 5 6 8 9 0 8 6 0 9 5 6 8 6 0 0 0 0 0 8 6 0 9 5 6 8 6 5 6 8 9 0 0 0 0 0 5 6 6 6 8 8 9 0 8 6 0 9 5 6 8 6 8 6 0 9 5 6 8 6 5 6 8 9 0 0 0 0 5 6 8 9 0 0 0 5 6 8 9 0 8 6 0 9 5 6 8 6 0 49 _() 5 6 8 9 0 8 6 0 9 5 6 8 6 0 5 6 8 9 0 8 6 0 9 5 6 8 6 2 0 _(2) : [ COUNT[ [i] ] ] = [i], COUNT[ [i] ]-- COUNT 2 3 4 5 6 8 5 6 8 9 0 8 6 0 9 5 6 8 6 4 4 6 8 8 6 0 9 5 6 8 6 5 6 8 9 0 2 0 2 [ COUNT [ [i] ] ] = [i] 8 6 0 9 5 6 8 6 5 6 8 9 0 3 0 2 [ COUNT [ [8] ] ] = [8] : COUNT[i] = COUNT[i] + COUNT[i-] 5 6 8 9 0 3 0 2 [ COUNT [ 6 ] ] = 6 [ 4 ] = 6 COUNT [ [i] ]-- COUNT [ [8] ]-- COUNT [ 6 ]-- 4 4 6 8 2 3 4 5 6 8 3 4 6 8 5 52 _(3) _(4) COUNT 2 3 4 5 6 8 5 6 8 9 0 8 6 0 9 5 6 8 3 4 6 8 COUNT 2 3 4 5 6 8 5 6 8 9 0 8 6 0 9 5 6 3 4 5 8 [ COUNT [ [i] ] ] = [i] [ COUNT [ [i] ] ] = [i] [ COUNT [ [] ] ] = [] [ COUNT [ [6] ] ] = [6] [ COUNT [ 8 ] ] = 8 COUNT [ [i] ]-- [ COUNT [ 6 ] ] = 6 COUNT [ [i] ]-- [ 6 ] = 8 COUNT [ [] ]-- [ 3 ] = 6 COUNT [ [6] ]-- COUNT [ 8 ]-- COUNT [ 6 ]-- 2 3 4 5 6 8 6 3 4 5 8 2 3 4 5 6 8 6 8 2 4 5 8 53 54
_(5) _(6) 2 3 4 5 6 8 5 6 8 9 0 8 6 0 9 5 2 4 5 8 2 3 4 5 6 8 5 6 8 9 0 8 6 0 2 4 5 6 6 6 8 0 2 4 5 8 5 6 6 8 9 0 0 4 5 8 2 3 4 5 6 8 5 6 8 9 0 8 6 0 9 0 2 4 5 8 2 3 4 5 6 8 5 6 8 9 0 8 0 4 5 6 5 6 6 8 0 2 4 5 6 8 5 6 6 6 8 9 0 0 4 4 6 2 3 4 5 6 8 5 6 8 9 0 8 6 0 0 2 4 5 6 8 5 6 6 8 9 0 2 4 5 6 2 3 4 5 6 8 5 6 6 6 8 8 9 0 5 6 8 9 0 0 4 4 6 56 CountingSort ([ ], n) [:n], [:n] MIN = MX = [0]; for (i=; i<n; i++) if ([i] < MIN) MIN = [i]; // if ([i] > MX) MX = [i]; // for (j=min; j <= MX; j++) COUNT[j] = 0; // for (i=; i <= n; i++) COUNT[[i]]++; // for (j=min+; j <= MX; j++) // COUNT[j] = COUNT[j] + COUNT[j-]; for (i=n; i > 0; i--) // [] [] [COUNT[[i]]] = [i]; COUNT[[i]]--; return [:n]; k O(k+n) k=o(n) O(n), COUNT[ ] [ ] 5 58 O(n), 59 60 _ : 6~00 5 8 68 82 65 00 6 95 65 6 68 82 95 00 6~65 ~0 ~5 6~80 8~ 86~90 9~95 96~00 6 82 65 68 95 00 6~65 ~0 ~5 6~80 8~ 86~90 9~95 96~00 6~65 ~0 ~5 6~80 8~ 86~90 9~95 96~00 6 65 68 82 95 00 6 62
ucketsort ([ ], n) MIN = MX = [0]; for (i=; i<n; i++) if ([i] < MIN) MIN = [i]; // if ([i] > MX) MX = [i]; // INTERVL = (MX-MIN+)/n ; for (i=0; i<n; i++) [i] UCKET[([i]-MIN)/INTERVL] ; for (i=0; i<n; i++) UCKET[i] ; UCKET[0] UCKET[n-] return [0 : n-]; n/k (k) UCKET[ ], [ ] 63 64 O(n) 65 2 265 482 95 36 68 00 2 265 482 95 36 68 00 00 36 482 265 95 2 68 00 36 265 68 482 2 95 68 95 00 265 2 36 482 d n O(dn) d O(n) 6 68 O(n 2 ) O(n 2 ) O(n 2 ) O(n 2 ) O(nlogn) O(n 2 ), O(nlogn) : : O(nlogn) O(n) O(n) O(n) 69