Tìm ki m nh phân là ph ng pháp tìm ki m ph bi n đ c th c hi n trên m t dãy đã đ c s p th t . N i dung c a gi i thu t đ c th c hi n nh sau: l y khóa c n tìm ki m X
so sánh v i n i dung c a khóa c a ph n t gi a, v trí c a ph n t gi a là mid = (low + hight )/ 2, trong đó c n d i low =0, c n trên hight = n-1. Vì dãy đã đ c s p x p nên n u n i dung c a khóa t i v trí gi a l n h n X thì ph n t c n tìm thu c kho ng [mid+1, hight], n u n i dung c a khóa t i v trí gi a nh h n X thì ph n t c n tìm thu c kho ng [low, mid- 1], n u n i dung c a khóa t i v trí gi a trùng v i X thì đó chính là ph n t c n tìm. b c ti p theo, n u n i dung c a khóa t i v trí gi a l n h n X thì ta d ch chuy n c n d i low
lên v trí mid+ 1, n u n i dung c a khóa t i v trí gi a nh h n X thì ta d ch chuy n c n trên v v trí mid- 1. Quá trình đ c l p l i cho t i khi g p khóa có n i dung trùng v i X
ho c c n d i v t quá c n trên hay X không thu c dãy. Thu t toán tìm ki m nh phân đ c minh h a nh sau:
int Binary_Search( int *A, int X, int n){ int mid, low=0, hight = n-1;
while ( low<=hight ){ // l p n u c n d i v n nh h n c n trên mid = (low + hight) /2; // xác đnh v trí ph n t gi a if (X > A[mid] ) low = mid +1; // X thu c [mid+1, hight] else if (X < A[mid] ) hight = mid- 1; // X thu c [low, mid-1] else return(mid);
}
return(-1); // X không thu c dãy } Ch ng trình c th đ c cài đ t nh sau: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h>
int Binary_Search( int *, int, int); void Bubble(int *, int);
int Binary_Search( int *A, int X, int n) { int mid, low = 0, hight = n-1; while (low<=hight){
mid = (low +hight)/2;
if (X >A[mid] ) low = mid +1; else if (X<A[mid] ) hight = mid -1; else return (mid);
}
return(-1); }
void Init(int *A, int n){ int i;
printf("\n Tao lap day so:"); for (i=0; i<n;i++){
A[i]=random(1000); printf("%5d",A[i]); }
delay(1000); }
void Bubble(int *A, int n){ register i,j,temp;
for (i=1; i<n; i++){
for (j=n-1; j>=i;j--){ if (A[j-1]>A[j]){ temp=A[j-1]; A[j-1]=A[j]; A[j]=temp; } }
printf("\n Ket qua lan:%d", i);
In(A,n);
} }
void In(int *A, int n){ register int i; for(i=0;i<n;i++) printf("%5d",A[i]); delay(1000); } void main(void){ int *A,n, X, k;clrscr();
printf("\n Nhap n="); scanf("%d",&n); printf(“\n S c n tìm X=”); scanf(“%d”,&X); A=(int *) malloc(n*sizeof(int)); Init(A,n);Bubble(A,n); k= Binary_Search(A, X, n); if ( k>0) printf (“\n %d v trí s %d”, X, k); else
printf(“\n %d không thu c dãy”); getch();
free(A); }
NH NG N I DUNG C N GHI NH
X Hi u đ c ý ngh a vai trò c a bài toán s p x p và tìm ki m trong tin h c.
X Cài đ t nhu n nhuy n các gi i thu t s p x p và tìm ki m trên các c u trúc d li u khác nhau.
X Gi i quy t các bài t p th c hành kèm theo làm th ng ti n k n ng gi i quy t bài toán s p x p & tìm ki m.
BÀI T P CH NG 6
Bài 1. Cài đ t ch ng trình theo thu t toán Quick Sort không dùng ph ng pháp đ qui mà dùng c u trúc stack.
Bài 2. Tìm hi u v gi i thu t Shell-Sort là ph ng pháp c i ti n c a Insertion Sort.
Bài 3. Cài đ t l i gi i thu t Bubble Sort sao cho các node nh đ c đ y d n v phía tr c.
Bài 4. M t Ternary Heap là cây tam phân g n đ y đ c cài đ t b ng m ng m t chi u, m i node có ba node con. N i dung c a node cha bao gi c ng l n h n ho c b ng n i dung c a node con, các node đ c đánh s t 0 đ n n-1, node i có 3 con là 3i+1, 3i+2, 3i+3. Hãy cài đ t gi i thu t Ternary Heap.
Bài 5. Cài đ t gi i thu t Bubble Sort trên file.
Bài 6. Cài đ t gi i thu t Insertion Sort trên file.
Bài 7. Cài đ t gi i thu t Quick Sort trên file.
Bài 8. Cài đ t các gi i thu t s p x p theo nhi u khoá khác nhau.
Bài 9. Nghiên c u và cài đ t thu t toán tìm ki m tam phân.
Bài 10.Nghiên c u và cài đ t thu t toán s p x p ki u hoà nh p th c hi n trên file.
Bài 11.Vi t ch ng trình chuy n đ i m t file d li u đ c t ch c theo khuôn d ng *.DBF thành file ki u text. Ng c l i, chuy n đ i file d li u ki u text thành m t file d li u theo khuôn d ng DBF.
Bài 12.Tìm hi u cách s p x p và tìm ki m theo ki u index c a các h qu n tr c s d li u nh foxprol ho c access.
TÀI LI烏U THAM KH謂O
[1] Lê H u L p - Nguy n Duy Ph ng. Giáo trình K thu t l p trình. NXB B u i n, 2002.
[2] Xuân Lôi. C u trúc d li u và gi i thu t. NXB Khoa H c K Thu t, 2000. [3] ng Huy Ru n. Lý thuy t đ th. NXB Khoa H c K Thu t, 2003
[4] William Ford, William Topp. Data Structures with C++. Prentice Hall, 1996. [5] Mark Allen Weiss. Data Structures and Algorithm Analysis In C. Prentice Hall, 1996.
[6] Phan ng C u. C u trúc d li u và Gi i thu t (Tài li u gi ng d y–H c Vi n Công ngh BCVT), 2003.
M影C L影C Ch ng 1: I C NG V K THU T L P TRÌNH C U TRÚC ...3 1.1. S l c v l ch s l p trình c u trúc...3 1.2. C u trúc l nh, l nh có c u trúc, c u trúc d li u ...5 1.2.1. C u trúc l nh (c u trúc đi u khi n) ...5 1.2.2. L nh có c u trúc ...7 1.2.3. C u trúc d li u...7 1.3. Nguyên lý t i thi u ...8 1.3.1. T p các phép toán ...8 1.3.2. T p các l nh vào ra c b n...11 1.3.3. Thao tác trên các ki u d li u có c u trúc...11 1.4. Nguyên lý đa ph ng ...13 1.5. Nguyên lý nh t quán...15 1.6. Nguyên lý an toàn...16 1.7. Ph ng pháp Top-Down ...18 1.8. Ph ng pháp Bottom - Up...22 Ch ng 2: DUY T VÀ QUI ...29 2.1. nh ngh a b ng đ qui ...29 2.2. Gi i thu t đ qui ...30
2.3. Thu t toán sinh k ti p ...31
2.4. Thu t toán quay lui (Back track) ...34
2.5. Thu t toán nhánh c n ...37
Ch ng 3: NG N X P, HÀNG I VÀ DANH SÁCH MÓC N I (STACK, QUEUE, LINK LIST)...51
3.1. Ki u d li u ng n x p và ng d ng...51
3.1.1. nh ngh a và khai báo ...51
3.1.2. Các thao tác v i stack ...53
3.2. Hàng đ i (Queue) ...55
3.2.1. nh ngh a và khai báo ...55
3.2.2. ng d ng hàng đ i...57
3.3. Danh sách liên k t đ n ...62
3.3.1. Gi i thi u và đnh ngh a...62
3.3.2. Các thao tác trên danh sách móc n i...63
3.4. Danh sách liên k t kép...67
Ch ng 4: C U TRÚC D LI U CÂY (TREE)...77
4.1. nh ngh a và khái ni m ...77
4.2. Cây nh phân...78
4.3. Bi u di n cây nh phân ...81
4.3.1. Bi u di n cây nh phân b ng danh sách tuy n tính ...81
4.3.2. Bi u di n cây nh phân b ng danh sách móc n i ...82
4.4. Các thao tác trên cây nh phân...83
4.4.1. nh ngh a cây nh phân b ng danh sách tuy n tính...83
4.4.2. nh ngh a cây nh phân theo danh sách liên k t:...83
4.4.3. Các thao tác trên cây nh phân ...83
4.5. Các phép duy t cây nh phân (Traversing Binary Tree)...88
4.5.1. Duy t theo th t tr c (Preorder Travesal)...88
4.5.2. Duy t theo th t gi a (Inorder Travesal) ...89
4.5.3. Duy t theo th t sau (Postorder Travesal) ...89
4.6. Cài đ t cây nh phân tìm ki m...90
Ch ng 5: TH (GRAPH) ...103
5.1. Nh ng khái ni m c b n c a đ th ...103
5.1.1. Các lo i đ th ...103
5.1.2. M t s thu t ng c b n c a đ th ...106
5.1.3. ng đi, chu trình, đ th liên thông...107
5.2. Bi u di n đ th trên máy tính ...107
5.2.1. Ma tr n k , ma tr n tr ng s ...107
5.2.2. Danh sách c nh (cung ) ...109
5.3. Các thu t toán tìm ki m trên đ th ...110
5.3.1. Thu t toán tìm ki m theo chi u sâu ...110
5.3.2. Thu t toán tìm ki m theo chi u r ng (Breadth First Search)...111
5.3.3. Ki m tra tính liên thông c a đ th ...112
5.3.4. Tìm đ ng đi gi a hai đnh b t k c a đ th ...113
5.4. ng đi và chu trình Euler ...115
5.5. ng đi và chu trình Hamilton...118
5.6. Cây bao trùm ...119
5.6.1. Khái ni m và đnh ngh a ...119
5.6.2. Tìm m t cây bao trùm trên đ th ...120
5.6.3. Tìm cây bao trùm ng n nh t...121
5.6.4. Thu t toán Kruskal...122
5.6.5. Thu t toán Prim...122
5.7. Bài toán tìm đ ng đi ng n nh t ...123
5.7.1. Phát bi u bài toán ...123
5.7.2. Thu t toán Dijkstra...124
5.7.3. Thu t toán Floy ...124
Ch ng 6: S P X P VÀ TÌM KI M (SORTING AND SEARCHING)...131
6.1. t bài toán ...131
6.2. Gi i thu t Selection Sort...132
6.3. Gi i thu t Insertion Sort ...134
6.4. Gi i thu t Bubble Sort ...136
6.5. Gi i thu t Shaker Sort ...137
6.6. Gi i thu t Quick Sort...139
6.7. Gi i thu t Heap Sort ...141
6.8. Gi i thu t Merge Sort ...143
6.9. Tìm ki m (Searching)...145
6.9.1. Tìm ki m tu n t (Sequential Searching) ...146
6.9.2. Tìm ki m nh phân (Binary Searching)...147
TÀI LI U THAM KH O ...152