Tìm kim (Searching)

Một phần của tài liệu HC VIN CONG NGH BU CHINH VIN THONG (1) (Trang 146)

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 LIU THAM KHO

[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. Cu trúc d liu và gii thut. 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. Cu trúc d liu và Gii thut (Tài li u gi ng d y–Học Vi n Công ngh BCVT), 2003.

MC LC 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

Một phần của tài liệu HC VIN CONG NGH BU CHINH VIN THONG (1) (Trang 146)

Tải bản đầy đủ (PDF)

(156 trang)