Tìm kim nh phân (Binary Searching)

Một phần của tài liệu Tài liệu Bài giảng " kỹ thuật lập trình " pdf (Trang 148)

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 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. 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.

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

Một phần của tài liệu Tài liệu Bài giảng " kỹ thuật lập trình " pdf (Trang 148)

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

(156 trang)