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

Các giải thuật tìm kiếm pot

13 308 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 13
Dung lượng 1,29 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CÁC GIẢI THUẬT TÌM KIẾM 1... CÁC GIẢI THUẬT TÌM KIẾM Có 2 giải thuật thường được áp dụng: Tìm tuyến tính và tìm nhị phân... Tìm kiếm tuyến tính  Ý tưởng Tiến hành so sánh x lần lượt

Trang 1

CÁC GIẢI THUẬT

TÌM KIẾM

1

Trang 2

2 CÁC GIẢI THUẬT TÌM KIẾM

Có 2 giải thuật thường được áp dụng: Tìm tuyến tính

và tìm nhị phân

Để đơn giản cho việc minh họa, ta đặc tả như sau:

Tập dữ liệu được lưu trữ là dãy số a 1 , a 2 , ,a N

 Giả sử chọn cấu trúc dữ liệu mảng để lưu trữ dãy số này

trong bộ nhớ chính, có khai báo: int a[N];

Khoá cần tìm là x, được khai báo như sau: int x;

2

a 1 a 2 a 3 a 4 a 5 … a n-1 a N

Trang 3

Chưa hết mảng

3 Tìm kiếm tuyến tính

Ý tưởng

Tiến hành so sánh x lần lượt với phần tử thứ nhất, thứ

hai, của mảng a cho đến khi gặp được phần tử có

khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x

Minh họa tìm x =10

Minh họa tìm x =25

3

7 5 12 41 10 32 13 9 15 3

7 5 12 41 10 32 13 9 15 3

10

10

25

Chưa hết mảng

Đã tìm thấy tại

vị trí 5

Đã hết mảng

Trang 4

Giải thuật

Bước 1:

  i = 1;     // bắt đầu từ phần tử đầu tiên của dãy 

Bước 2:

So sánh a[i] với x,  có  2 khả năng : 

a[i] = x : Tìm thấy. Dừng 

a[i] != x :  Sang Bước 3. 

Bước 3:

 i = i+1;      // xét tiếp phần tử kế trong mảng 

 Nếu i >N: Hết mảng, không tìm thấy. Dừng

 Ngược lại: Lặp lại Bước 2.  4

Trang 5

Cài đặt

int LinearSearch(int a[], int N, int x)

{

int i=0;

while ((i<N) && (a[i]!=x ))    

i++;

if(i==N)

return -1;// tìm hết mảng nhưng không có x else

return i;// a[i] là phần tử có khoá x

Trang 6

Cải tiến (dùng lính canh) giúp giảm bớt một

phép so sánh

Minh họa tìm x =10

Minh họa tìm x = 25

6

10

7 5 12 41 10 32 13 9 15 3

10

10

7 5 12 41 10 32 13 9 15 3

25

11

25

25

Trang 7

Giải thuật

Bước 1:   i = 1;    

a[N+1] = 1;     // phần tử “lính canh”   

Bước 2:

So sánh a[i] với x,  có  2 khả năng : 

a[i] = x : sang bước 3

a[i] != x :  i = i+ 1; 

Bước 3:

Nếu i ≤ N : tìm thấy x tại vị trí i.

Ngược lại: không tìm thấy x trong dãy.

7

Trang 8

Cài đặt

int LinearSearch2(int a[],int N,int x)

{  int i=0; // mảng gồm N phần tử từ a[0] a[N-1]

 a[N] = x; // thêm phần tử thứ N+1 

while (a[i]!=x )

i++; 

if (i==N)

else 

Ðánh giá giải thuật

Độ phức tạp tính toán cấp n: T(n)=O(n) 8

Trang 9

4 Tìm kiếm nhị phân

Ý tưởng

Áp dụng đối với những dãy số đã có thứ tự

Giải thuật tìm cách giới hạn phạm vi tìm kiếm sau mỗi

lần so sánh x với một phần tử trong dãy Ý tưởng của

giải thuật là tại mỗi bước tiến hành so sánh x với phần

tử nằm ở vị trí giữa của dãy tìm kiếm hiện hành, dựa

vào kết quả so sánh này để quyết định giới hạn dãy tìm

kiếm ở bước kế tiếp là nửa trên hay nửa dưới của dãy

tìm kiếm hiện hành

9

Trang 10

Minh họa tìm x = 41

10

3 14 16 19 22 41 46 51 63 71

x

m

3 14 16 19 22 41 46 51 63 71

x

3 14 16 19 22 41 46 51 63 71

r

m

x

3 14 16 19 22 41 46 51 63 71

Tìm thấy x tại

vị trí 6

Trang 11

Minh họa tìm x = 45

11

3 14 16 19 22 41 46 51 63 71

x

m

3 14 16 19 22 41 46 51 63 71

m

x

3 14 16 19 22 41 46 51 63 71

r

m

x

l

3 14 16 19 22 41 46 51 63 71

m

x

3 14 16 19 22 41 46 51 63 71

l > r: Kết thúc:

Không tìm thấy

Trang 12

Giải thuật

Bước 1: left = 1; right = N; // tìm kiếm trên tất cả các phần tử

Bước 2:

mid = (left+right)/2; // lấy mốc so sánh

So sánh a[mid] với x, có 3 khả năng :

 a[mid] = x: Tìm thấy Dừng

 a[mid] > x: //tìm tiếp x trong dãy con aleft amid -1

right =mid - 1;

 a[mid] < x: //tìm tiếp x trong dãy con amid +1 aright

left = mid + 1;

Bước 3:

Nếu left <= right //còn phần tử chưa xét tìm tiếp

Lặp lại Bước 2.

Ngược lại: Dừng //Ðã xét hết tất cả các phần tử. 12

Trang 13

Cài đặt

int BinarySearch(int a[],int N,int x )

int mid;

do{

mid = (left + right)/2;

if (x == a[mid])

return mid;//Thấy x tại mid else if (x < a[mid])

right = mid -1;

else

left = mid +1;

}while (left <= right);

return -1; // Tìm hết dãy mà không có x }

Ngày đăng: 09/07/2014, 09:20

TỪ KHÓA LIÊN QUAN

w