1. Trang chủ
  2. » Công Nghệ Thông Tin

Cấu trúc dữ liệu - Phần 3 doc

37 183 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 37
Dung lượng 734,72 KB

Nội dung

12/6/2010 1 LOGO GVGD: Trng Phc Hi Tìm kim và sp xp 2 Ni dung 1. Bài toán tìm kim và sp xp 2. Mt s phng pháp tìm kim 3. Mt s phng pháp sp xp 3 Bài toán tìm kim và sp xp  Tìm kim và sp xp là 2 bài toán rt kinh đin trong tin hc  Tìm kim là thao tác đc thc hin nhiu nht trong các h thng lu tr và qun lý d liu  Tra t đi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 khi d liu đc t chc theo mt trt t nào đó  Sp xp d liu cng là yêu cu cn phi có trong các h thng thông tin qun lý, … 12/6/2010 2 4 Bài toán tìm kim và sp xp  Bài toá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 ra v trí xut hin ca mt phn t nào đó 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 các 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 5 Bài toán tìm kim và sp xp  Tính hiu qu ca các phng pháp tìm kim và 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 và sp xp cng ph thuc vào d liu lu tr  b nh trong hay b nh ngoài  Các gii thut đc trình bày dành cho d liu lu tr  b nh trong 6 Ni dung 1. Bài toán tìm kim và sp xp 2. Mt s phng pháp tìm kim 3. Mt s phng pháp sp xp 12/6/2010 3 7 Bài toán tìm kim  Bài toán  Cho mng 1 chiu A gm N phn t nguyên. Cho bit s nguyên x có tn ti trong A hay không? Nu có thì cho bit 1 v trí xut hin ca x trong A  Input: Mng A gm N phn t nguyên, s nguyên x  Ouput:  p ≥ 0 là v trí xut hin ca x trong A  p < 0 nu x không tn ti trong A 8 Tìm kim tun t  Ý tng  Xét ln lt tng phn t trong toàn b không gian tìm kim đ tìm ra 1 phn t tha tiêu chí hoc không tìm thy phn t nào tha tiêu chí  Thao tác dng li ngay khi tìm thy phn t đu tiên tha tiêu chí hoc xét ht tt c phn t 9 Tìm kim tun t  Gii thut Bt đu N, A[0], A[1], , A[N-1], x i < N F A[i] = x Kt thúc T i = 0 T F i = i + 1 -1 i 12/6/2010 4 10 Tìm kim tun t  Cài đt int LinearSearch(int A[], int N, int x) { for (int i = 0; i < N; i++) { if (A[i] == x) return i; } return -1; } 11 Tìm kim tun t  ánh giá  Da trên s phép so so sánh ca gii thut   phc tp tính toán cp N: T(N) = O(N) Trng hp S phép so sánh Din gii Tt nht 1 x nm  đu mng Xu nht N x không thuc mng 12 Tìm kim nh phân  Ý tng  iu kin thc thi gii thut: không gian tìm kim phi đc sp th t (tng dn hoc gim dn) theo tiêu chí tìm kim  Da vào tiêu chí có th t đ thu hp mt na không gian tìm kim sau mi bc thc hin 12/6/2010 5 13 Tìm kim nh phân  Gii thut  Bc 1: đt L = 0, R = N – 1 (L: đu dãy; R: cui dãy)  Bc 2:  Nu L < R đúng thì đn bc 3  Ngc li đn bc 4  Bc 3:  t M = (L + R)/2 (M: v trí gia dãy)  Trng hp x = A[M] thì tìm thành công. n bc 4  Trng hp x < A[M] thì đt R = M – 1  Trng hp A[M] < x thì đt L = M + 1  Quay v bc 2  Bc 4: kt thúc 15 Tìm kim nh phân  Minh ha 15 12 9 5 4 2 1 6 5 4 3 2 1 0 x = 9 15 12 9 5 4 2 1 x = 9 15 12 9 5 4 2 1 x = 9 16 Tìm kim nh phân  Cài đt int BinSearch(int A[], int N, int x) { int L = 0, R = N – 1; while (L < R) { int M = (L + R)/2; if (A[M] == x) return M; if (x < A[M]) R = M – 1; else L = M + 1; } return -1; } 12/6/2010 6 17 Tìm kim nh phân  ánh giá  T(N) = O(log 2 N) Trng hp S phép so sánh Din gii Tt nht 1 x nm  gia mng Xu nht log 2 N x không thuc mng 18 Ni dung 1. Bài toán tìm kim và sp xp 2. Mt s phng pháp tìm kim 3. Mt s phng pháp sp xp 19 Bài toán sp xp  Bài toán  Cho mng 1 chiu A gm N phn t nguyên. Hãy sp xp mng A sao cho các phn t ca A có th t không gim (A[0] ≤ A[1] ≤ … ≤ A[N - 1])  Input: Mng A gm N phn t nguyên  Ouput: Mng A gm N phn t nguyên vi th t không gim 12/6/2010 7 20 Bài toán sp xp  Mt s phng pháp thc hin  Chn trc tip (selection sort)  i ch trc tip (interchange sort)  Ni bt (bubble sort)  Shaker sort  Chèn trc tip (insertion sort)  Shell Sort  Heap sort  Quick sort  Merge sort 21 Phng pháp chn trc tip  Ý tng  Chn đúng phn t ln th i và đa v v trí i trong dãy  Thc hin đa ln lt N – 1 phn t v đúng v trí ca nó đ có đc dãy có th t 22 Phng pháp chn trc tip  Gii thut  Bc 1: đt i = 0  Bc 2: đt min = v trí ca phn t nh nht trong dãy t i đn N – 1 (cui mng)  Bc 3:  Hoán v A[i] và A[min]  t i = i + 1  Bc 4:  Nu i < N – 1 đúng quay v bc 2  Ngc li kt thúc 12/6/2010 8 24 Phng pháp chn trc tip  Minh ha 6 19 10 7 4 3 2 1 7 6 5 4 3 2 1 0 3 19 1 7 4 6 2 10 i = 0 3 19 10 7 4 6 2 1 i = 1 3 19 10 7 4 6 2 1 i = 2 i = 3 25 Phng pháp chn trc tip  Minh ha 19 10 7 6 4 3 2 1 7 6 5 4 3 2 1 0 6 19 10 7 4 3 2 1 i = 4 7 19 10 6 4 3 2 1 i = 5 10 19 7 6 4 3 2 1 i = 6 i = 7 26 Phng pháp chn trc tip  Cài đt void SelectionSort(int A[], int N) { for (int i = 0; i < N - 1; i++) { int min = i; for (int j = i + 1; j < N; j++) if (A[j] < A[min]) min = j; HoanVi(A[i], A[min]); } } 12/6/2010 9 27 Phng pháp chn trc tip  ánh giá  Thao tác chính nh hng đn tính hiu qu ca gii thut là thao tác so sánh và thao tác gán   phc tp ca gii thut đc đánh giá thông qua s phép so sánh và s phép gán Trng hp S phép so sánh S phép gán Tt nht            0 Xu nht                        28 Phng pháp đi ch trc tip  Ý tng  Dãy tng dn là dãy mà mi phn t đng sau đu ln hn hoc bng phn t đng trc (j > i, A[j] ≥ A[i])  Xét tt c cp phn t ca dãy, nu phn t đng trc ln hn phn t đng sau thì hoán v chúng  i < j, nu A[i] > A[j] thì đi ch A[i] và A[j] 29 Phng pháp đi ch trc tip  Gii thut  Bc 1: đt i = 1  Bc 2: Xét tt c v trí j > i  Nu A[i] > A[j] thì đi ch A[i] và A[j]  Bc 3: đt i = i + 1  Nu i < N – 1 thì quay v bc 2  Ngc li kt thúc 12/6/2010 10 31 Phng pháp đi ch trc tip  Minh ha 3 19 1 7 4 6 2 10 7 6 5 4 3 2 1 i = 0 3 19 1 7 4 6 10 2 3 19 2 7 4 6 10 1 0 32 Phng pháp đi ch trc tip  Minh ha 3 19 2 7 4 6 10 1 7 6 5 4 3 2 1 i = 1 3 19 2 7 4 10 6 1 3 19 2 7 6 10 4 1 3 19 4 7 6 10 2 1 0 33 Phng pháp đi ch trc tip  Minh ha 3 19 4 7 6 10 2 1 7 6 5 4 3 2 1 i = 2 3 19 4 7 10 6 2 1 3 19 6 7 10 4 2 1 4 19 6 7 10 3 2 1 0 [...]...12/6/2010 i =3 1 2 3 10 7 6 19 4 1 2 3 7 10 6 19 4 1 2 3 6 10 7 19 4 1 2 3 4 10 7 19 6 0 1 2 3 4 5 6 7 34 i=4 1 2 3 4 10 7 19 6 1 2 3 4 7 10 19 6 1 2 3 4 6 10 19 7 0 1 2 3 4 5 6 7 35 i=5 1 2 3 4 6 10 19 7 1 2 3 4 6 7 19 10 0 1 2 3 4 5 6 7 36 11 12/6/2010 i=6 2 3 4 6 7 19 10 1 2 3 4 6 7 10 19 1 2 3 4 6 7 10 19 0 i=7 1 1 2 3 4 5 6 7 37 void InterchangeSort(int A[], int N) { for (int i = 0; i < N - 1; i++)... thì toàn 3: A[N- 1] 1 trên A trong khi dãy kia lên A 1 và 2 cho khi dãy A[0], A[1], , còn 1 125 A 10 2 6 4 7 B 10 4 7 3 15 C 2 6 1 19 1 19 3 15 132 34 12/6/2010 B 10 4 7 3 C 2 6 1 19 A 2 6 10 1 15 4 7 19 3 15 7 19 3 15 3 15 133 A 2 6 10 1 4 B 2 6 10 3 15 C 1 4 7 19 134 A B 2 6 10 3 C 1 4 7 19 A 1 2 4 6 15 7 10 19 135 35 12/6/2010 A 1 2 4 6 7 10 19 B 1 2 4 6 7 10 19 C 3 15 3 15 15 19 136 B 1 2 C 3 15 A... } 38 phép so sánh 39 12 12/6/2010 Xét lên và cho nhau, lên trên (có giá Sau lên trên 40 1 0 2 1 1 j=j 1] 1 3: i = i + 1 1 2 41 i=0 10 2 6 4 7 1 19 3 10 2 6 4 7 1 3 19 1 10 2 6 4 7 3 19 1 2 3 4 5 6 7 43 13 12/6/2010 i=1 1 10 2 6 4 7 3 19 1 10 2 3 6 4 7 19 1 2 10 3 6 4 7 19 0 1 2 3 4 5 6 7 44 i=2 1 2 10 3 6 4 7 19 1 2 10 3 4 6 7 19 1 2 3 10 4 6 7 19 0 1 2 3 4 5 6 7 10 4 6 7 19 45 i =3 1 2 3 1 i=4 2 3. .. 1 6 3 4 5 6 3 4 5 6 3 3 7 7 97 19 3 0 0 7 10 7 1 2 1 10 2 4 2 1 6 4 2 1 6 3 4 5 6 3 4 5 6 3 19 7 7 98 Giai 2: 2: dãy còn ra heap và thành heap 3 10 0 0 7 10 7 1 2 1 6 2 4 2 1 6 4 2 1 3 3 4 5 6 3 4 5 6 19 19 7 7 99 25 12/6/2010 Giai 2: 1: Hoán và heap 10 3 0 0 7 6 7 1 2 1 6 2 4 2 1 3 4 2 1 10 3 4 5 6 3 4 5 6 19 19 7 7 100 2: dãy còn ra heap và thành heap 3 7 0 0 7 6 4 1 2 1 6 2 4 2 1 10 3 2 1 10 3 4... 3 4 5 6 và heap 19 19 7 7 101 2: 1: Hoán 7 1 0 0 4 6 4 1 2 1 6 2 3 2 1 10 3 2 7 10 3 4 5 6 3 4 5 6 19 19 7 7 102 26 12/6/2010 2: dãy còn ra heap và thành heap 1 6 0 0 4 6 4 1 2 1 1 2 3 2 7 10 3 2 7 10 3 4 5 6 3 4 5 6 và heap 19 19 7 7 1 03 2: 1: Hoán 6 2 0 0 4 1 4 1 2 1 1 2 3 2 7 10 3 6 7 10 3 4 5 6 3 4 5 6 19 19 7 7 104 2: 2: dãy còn ra heap và thành heap 2 4 0 0 4 1 3 1 2 1 1 2 3 6 7 10 2 6 7 10 3. .. pos - len; } A[pos + len] = x; } } } 73 Shell Sort giá là minh còn vào và giá các Sedgewick có minh dãy 1, 8, 23, 77, O(N4 /3) , 4j + 1 +3* 2j + 1 74 22 12/6/2010 Shell Sort dãy Knuth k = log3N 1, 4, 13, 40, 127, Marcin Ciura 1750, 1 và hi = 3. hi-1 + 1, 1, 4, 10, 23, 57, 132 , 30 1, 701, Sedgewick 16577, 1, 8, 23, 77, 281, 10 73, 41 93, 75 trí các phân theo quan so sánh cây 76 10 0 2 6 1 2 4 7 1 19 3 4 5 6 3. .. 4 5 6 3 4 5 6 19 19 7 7 105 27 12/6/2010 2: 1: Hoán và heap 4 2 0 0 3 1 3 1 2 1 1 2 2 6 7 10 4 6 7 10 3 4 5 6 3 4 5 6 19 19 7 7 106 2: 2: dãy còn ra heap và thành heap 2 3 0 0 3 1 2 1 2 1 1 2 4 6 7 10 4 6 7 10 3 4 5 6 3 4 5 6 và heap 19 19 7 7 107 1: Hoán 3 1 0 0 2 1 2 1 2 1 3 2 4 6 7 10 4 6 7 10 3 4 5 6 3 4 5 6 19 19 7 7 108 28 12/6/2010 2: 2: dãy còn ra heap và thành heap 1 2 0 0 2 3 1 1 2 1 3 2 4... i < N thì quay 2 thúc 1 55 17 12/6/2010 i=1 10 2 6 4 7 1 19 3 i=2 2 10 6 4 7 1 19 3 i =3 2 6 10 4 7 1 19 3 i=4 2 4 6 10 7 1 19 3 0 1 2 3 4 5 6 7 57 i=5 2 4 6 7 10 1 19 3 i=6 1 2 4 6 7 10 19 3 i=7 1 2 4 6 7 10 19 3 i=8 1 2 3 4 6 7 10 19 0 1 2 3 4 5 6 7 58 void InsertionSort(int A[], int N) { for (int i = 1; i < N; i++) { int x = A[i], pos = i - 1; while (pos >= 0 && A[pos] > x) { A[pos + 1] = A[pos];... ell Sort h =3 10 4 19 2 7 6 0 1 2 3 1 3 4 5 15 6 7 8 68 20 12/6/2010 ell Sort h =3 4 10 19 2 3 1 0 1 2 7 6 3 4 5 15 6 7 8 69 ell Sort h=2 4 1 2 0 1 3 10 2 19 6 3 4 5 15 7 6 7 8 70 ell Sort h=2 1 3 2 0 1 4 6 2 15 7 3 4 5 19 10 6 7 8 71 21 12/6/2010 ell Sort h=1 1 2 3 6 4 7 15 10 19 1 2 3 4 6 7 15 10 19 1 2 3 4 6 7 10 15 19 0 1 2 3 4 5 6 7 8 72 ell Sort void ShellSort(int A[], int N, int h[], int k) { for... 2 3 4 5 6 7 10 4 6 7 19 45 i =3 1 2 3 1 i=4 2 3 4 10 6 7 19 0 1 2 3 4 5 6 7 1 2 3 4 10 6 7 19 1 2 3 4 6 10 7 19 0 1 2 3 4 5 6 7 46 14 12/6/2010 i=5 1 2 3 4 6 10 7 19 1 2 3 4 6 7 10 19 0 1 2 3 4 5 6 7 47 void BubbleSort(int A[], int N) { for (int i = 0; i < N - 1; i++) for (int j = N - 1; j > i; j ) if (A[j] < A[j - 1]) HoanVi(A[j], A[j - 1]); } 48 phép so sánh 49 15 12/6/2010 Là pháp pháp lên nhanh chìm . 4 6 10 2 3 19 2 7 4 6 10 1 0 32 Phng pháp đi ch trc tip  Minh ha 3 19 2 7 4 6 10 1 7 6 5 4 3 2 1 i = 1 3 19 2 7 4 10 6 1 3 19 2 7 6 10 4 1 3 19 4 7 6 10 2 1 0 33 Phng. i = 3 4 19 6 10 7 3 2 1 4 19 7 10 6 3 2 1 6 19 7 10 4 3 2 1 0 35 Phng pháp đi ch trc tip  Minh ha 6 19 7 10 4 3 2 1 7 6 5 4 3 2 1 i = 4 6 19 10 7 4 3 2 1 7 19 10 6 4 3 2 1. 5 4 3 2 1 0 19 7 6 4 3 10 2 1 19 7 4 6 3 10 2 1 19 7 6 4 10 3 2 1 i = 2 46 Phng pháp ni bt  Minh ha 7 6 5 4 3 2 1 0 19 7 6 4 10 3 2 1 19 7 10 6 4 3 2 1 i = 3 7 6 5 4 3 2 1

Ngày đăng: 08/08/2014, 04:21