Tìm ki m là cơng vi c quan trọng đ i với các h th ng tin học và có liên quan m t thi t với q trình s p x p d li u. Bài tốn tìm ki m tổng qt có thểđ c phát biểu nh sau:
“Cho một b ng g m n b n ghi R1, R2, . ., Rn. Với mỗi b n ghi Ri đ c t ng ng với một khoá ki (tr ng th i trong record). Hãy tìm b n ghi có giá tr c a khố bằng X cho
N u chúng ta tìm đ c b n ghi có giá tr khóa là X thì phép tìm ki m đ c tho (successful). N u khơng có giá tr khóa nào là X thì q trình tìm ki m là khơng tho (unsuccessful). Sau q trình tìm ki m, có thể xu t hi n yêu c u bổ xung thêm b n ghi mới có giá tr khóa là X thì gi i thu t đ c gọi là gi i thu t tìm ki m bổ sung.
6.9.1. Tìm ki m tu n tự (Sequential Searching)
Tìm ki m tu n tự là k thu t tìm ki m cổđiển trên một danh sách ch a đ c s p x p. Nội dung c b n c a ph ng pháp tìm ki m tu n tự là duy t từ b n ghi th nh t cho tới b n ghi cu i cùng, và so sánh l n l t giá tr c a khoá với giá tr X c n tìm. Trong q trình
duy t, n u có b n ghi trùng với giá tr X thì chúng ta đ a ra v trí c a b n ghi trong dãy, n u duy t tới cu i dãy mà khơng có b n ghi nào có giá tr c a khố trùng với X thì quá trình tìm ki m tr l i giá tr -1 (-1 đ c hiểu là giá tr khoá X khơng thuộc dãy). Ch ng trình cài đặt ph ng pháp tìm ki m tu n tựđ c thực hi n nh sau: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h> int Sequential(int *, int, int); void Init(int *, int);
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); }
int Bubble(int *A, int x, int n){ register i,temp;
for (i=0; i<n ; i ++){ if (A[i] == X) return(i); } return(-1); } void main(void){ int *A,n, x, k;clrscr();
printf("\n Nhap n="); scanf("%d",&n); printf(“\n S x c n tìm:”); scanf(“%d”, &x);
A=(int *) malloc(n*sizeof(int)); k= Sequential(A,x,n);
if ( k>=0)
printf(“\n %d v trí %d”, x,k); else
printf(“\n %d khơng thuộc dãy”); free(A); getch();
}
6.9.2. Tìm ki m nh phân (Binary Searching)
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. Q 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 tố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
9 Hiểu đ c ý nghĩa vai trị c a bài tốn s p x p và tìm ki m trong tin học.
9 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.
9 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 tố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 tố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 tốn tìm ki m trên đ th ............................................................110
5.3.1. Thu t tốn tìm ki m theo chi u sâu ...................................................110
5.3.2. Thu t tố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 tố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