Tài liệu tham khảo bài giảng môn Cấu trúc dữ liệu - Phần 3 Tìm kiếm và sắp xếp
12/6/2010 Tìm ki m s p x p GVGD: Tr ng Ph cH i LOGO N i dung Bài tốn tìm ki m s p x p M t s ph ng pháp tìm ki m M t s ph ng pháp s p x p Bài tốn tìm ki m s p x p Tìm ki m s p x p toán r t kinh n tin h c Tìm ki m thao tác đ h th ng l u tr Tra t c th c hi n nhi u nh t qu n lý d li u n, tìm ki m sinh viên, tìm ki m khách hàng, … Thao tác tìm ki m s th c hi n hi u qu d ch c theo m t tr t t li u đ ct S p x p d li u c ng yêu c u c n ph i có h th ng thơng tin qu n lý, … 12/6/2010 Bài tốn tìm ki m s p x p Bài tốn tìm ki m Cho m t t p g m N ph n t d li u Cho bi t s t n t i ho c ch v trí xu t hi n c a m t ph n t v i thơng tin xác đ nh đ c cho tr c Bài toán s p x p Cho m t t p g m N ph n t d li u S p x p ph n t d li u có th t (t ng ho c gi m d n) theo m t tiêu chí cho tr c Bài tốn tìm ki m s p x p Tính hi u qu c a ph ng pháp tìm ki m s p x p ph thu c vào tính ch t c a CTDL Các ph ng pháp tìm ki m s p x p c ng ph thu c vào d li u l u tr b nh hay b nh Các gi i thu t đ c trình bày dành cho d tr b nh li u l u N i dung Bài tốn tìm ki m s p x p M t s ph ng pháp tìm ki m M t s ph ng pháp s p x p 12/6/2010 Bài tốn tìm ki m Bài tốn Cho m ng chi u A g m N ph n t nguyên Cho bi t s nguyên x có t n t i A hay khơng? N u có cho bi t v trí xu t hi n c a x A Input: M ng A g m N ph n t Ouput: nguyên, s nguyên x p ≥ v trí xu t hi n c a x A p < n u x không t n t i A Tìm ki m tu n t Ýt ng Xét l n l t t ng ph n t tồn b khơng gian tìm ki m đ tìm ph n t th a tiêu chí ho c khơng tìm th y ph n t th a tiêu chí Thao tác d ng l i tìm th y ph n t tiêu chí ho c xét h t t t c ph n t đ u tiên th a Tìm ki m tu n t Gi i thu t B tđ u N, A[0], A[1], , A[N-1], x i=0 F T i i, A[j] ≥ A[i]) Xét t t c c p ph n t c a dãy, n u ph n t h n ph n t đ ng sau hốn v chúng đ ng tr cl n i < j, n u A[i] > A[j] đ i ch A[i] A[j] 28 Ph ng pháp đ i ch tr c ti p Gi i thu t B c 1: đ t i = B c 2: Xét t t c v trí j > i B N u A[i] > A[j] đ i ch A[i] A[j] c 3: đ t i = i + N u i < N – quay v b Ng c2 c l i k t thúc 29 12/6/2010 Ph ng pháp đ i ch tr c ti p Minh h a i=0 10 19 10 19 10 19 3 31 Ph ng pháp đ i ch tr c ti p Minh h a i=1 10 19 10 19 10 19 10 19 3 32 Ph ng pháp đ i ch tr c ti p Minh h a i=2 10 19 10 19 10 19 3 10 19 4 33 10 12/6/2010 Ph ng pháp Shell Sort ánh giá M t s dãy đ c đ ngh Knuth đ ngh k = log3N – hi = 3.hi-1 + 1, ch ng h n 1, 4, 13, 40, 127, … Marcin Ciura đ 1750, … Sedgewick đ 16577, … ngh 1, 4, 10, 23, 57, 132, 301, 701, ngh 1, 8, 23, 77, 281, 1073, 4193, 75 Ph ng pháp Heap Sort Ýt ng T n d ng thơng tin có đ c trình s p x p b tr c cho thao tác th c hi n b c ti p theo c Tìm c u trúc d li u cho phép tích l y thơng tin v vi c so sánh ph n t q trình s p x p B trí ph n t phân theo quan h so sánh d ng nh 76 Ph ng pháp Heap Sort Minh h a Xem dãy có d ng nh phân 10 19 78 23 12/6/2010 Ph ng pháp Heap Sort nh ngh a Heap M t dãy ph n t A[l], A[l + 1], …, A[r] (l < r) t o thành m t heap n u th a u ki n i [l, r], A[i] ≥ A[2*i + 1] A[i] ≥ A[2*i + 2] i 2*i + 2*i + Các c p ph n t (A[i], A[2*i + 1]) (A[i], A[2*i + 2]) đ c g i c p ph n t liên đ i 79 Ph ng pháp Heap Sort Các tính ch t c a Heap N u A[l], A[l + 1], …, A[r] t o thành m t heap lo i b m t s ph n t đ u dãy v n cịn th a heap N u A[l], A[l + 1], …, A[r] t o thành m t heap A[l] (ph n t đ u heap) ph n t l n nh t M i dãy A[l], A[l+1], …, A[r] v i r < 2*l + m t heap 80 Ph ng pháp Heap Sort Gi i thu t Giai đo n 1: T o heap t Giai đo n 2: B dãy ban đ u c 1: Hoán v ph n t B c 2: Lo i ph n t l i thành heap đ u cu i heap cu i kh i heap Hi u ch nh dãy B c 3: N u heap ph n t Ng c l i d ng gi i thu t quay v b c 81 24 12/6/2010 Ph ng pháp Heap Sort Minh h a Giai đo n 1: Hi u ch nh dãy đ t o thành heap 10 19 0 10 19 6 3 7 97 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 19 0 10 10 6 6 19 7 98 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 10 0 10 6 3 6 19 19 7 99 25 12/6/2010 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 10 0 7 4 10 6 19 19 7 100 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 0 6 10 10 6 19 19 7 101 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 0 6 10 10 6 19 19 7 102 26 12/6/2010 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 0 1 10 10 6 19 19 7 103 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 0 4 1 10 10 6 19 19 7 104 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 0 1 10 10 6 19 19 7 105 27 12/6/2010 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 0 3 1 2 10 10 6 19 19 7 106 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 0 2 1 10 10 6 19 19 7 107 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 0 2 10 10 6 19 19 7 108 28 12/6/2010 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap hi u ch nh dãy l i thành heap 0 1 10 10 6 19 19 7 109 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 1: Hoán v ph n t đ u cu i heap 0 2 10 10 6 19 19 7 110 Ph ng pháp Heap Sort Minh h a Giai đo n 2: B c 2: Lo i ph n t cu i kh i heap Heap ch ph n t nên gi i thu t d ng 10 19 Dãy đ c s p th t 111 29 12/6/2010 Ph ng pháp Heap Sort Cài đ t hàm Heap Sort void HeapSort(int A[], int N) { int l = 0, r = N – 1; CreateHeap(A, N); while (l < r) { HoanVi(A[l], A[r]); r ; Shift(A, l, r); } } 112 Ph ng pháp Heap Sort Cài đ t hàm hi u ch nh heap void Shift(int A[], int l, int r) { int i = l, j = 2*i + 1, x = A[i]; while (j = A[j]) return; A[i] = A[j]; i = j; j = 2*i + 1; } A[i] = x; } 113 Ph ng pháp Heap Sort Cài đ t hàm t o heap void CreateHeap(int A[], int N) { int l = N/2; int r = N – 1; while (l >= 0) { Shift(A, l, r); l ; } } 114 30 12/6/2010 Ph ng pháp Heap Sort ánh giá ánh giá gi i thu t Heap Sort ph c t p nh ng ch ng minh đ c tr ng h p x u nh t có đ ph c t p O(N.logN) 115 Ph ng pháp Quick Sort Ýt ng Ch n giá tr c a m t ph n t thu c dãy làm ch t Phân ho ch dãy c n s p thành dãy Dãy bên trái g m ph n t b ng giá tr c a ch t Dãy bên ph i g m ph n t c a ch t … … … kL ki … … … có giá tr nh h n ho c có giá tr l n h n giá tr kj … … … kR ≥ ch t ≤ ch t 116 Ph ng pháp Quick Sort Dãy sau đ c phân ho ch S p x p dãy bên trái dãy bên ph i dãy ban đ u s có th t Dãy ch g m ph n t đ c xem có th t ho c nhi u ph n t có giá tr Dãy bên trái dãy bên ph i c ng đ theo t t ng c s p th t 117 31 12/6/2010 Ph ng pháp Quick Sort Ch n ph n t Giá tr ph n t ch t ch t quy t đ nh tính hi u qu c a gi i thu t Ch t có giá tr l n nh t ho c bé nh t s ph n t c a dãy chênh l ch l n (m t dãy g m n – ph n t , dãy l i ch g m ph n t ) Ch t có giá tr trung v d n đ n s bên trái bên ph i có s l ng t Ch n giá tr c a ph n t ph n t c a dãy ng đ ng v trí gi a dãy làm giá tr ch t v trí gi a dãy = (v trí đ u dãy + v trí cu i dãy)/2 118 Ph ng pháp Quick Sort Dãy c n phân ho ch A[l] … A[r] Gi i thu t phân ho ch B B c 1: đ t i = l, j = r, x = A[(i + j)/2] //x ch t B c 2: N u i < j L p t ng i thêm A[i] < x L p gi m j A[j] > x c 3: N u i ≤ j Hoán v A[i] A[j] T ng i, gi m j Quay v b c 119 Ph ng pháp Quick Sort Cài đ t void Partition(int A[], int N) { int i = l, j = r, x = A[(l + r)/2]; while (i < j) { while (A[i] < x) i++; while (A[j] > x) j++; if (i