Tải bản đầy đủ (.ppt) (13 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (176.09 KB, 13 trang )

CÁC GIẢI THUẬT
TÌM KIẾM
1
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:

 a
1
, a
2
, ,a
N


         !     
" #$%&'()*#+",int a[N];

-"+./x')*#+"*,int x;
2
a
1
a
2
a
3
a
4


a
5
… a
n-1
a
N
0*1

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
2 3 4 5 6 7 8 9 : 2;
7 5 12 41 10 32 13 9 15 3
2 3 4 5 6 7 8 9 : 2;
2;
2;
36
0*
1

</

=
>?&6
<1


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
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
}
5
01@A &*B  #%$
C"+

Minh họa tìm x =10

Minh họa tìm x = 25
6
2;
7 5 12 41 10 32 13 9 15 3
2 3 4 5 6 7 8 9 : 2;
2;
2;
7 5 12 41 10 32 13 9 15 3
2 3 4 5 6 7 8 9 : 2;
36
22
36
36

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
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)
return-1; //tìmhếtmảngnhưngkhôngcóx
else
returni; //tìmthấyxtạivịtríi
}

Ðánh giá giải thuật
Độ phức tạp tính toán cấp n: T(n)=O(n)
8
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
Minh họa tìm x = 41
10
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
x
m
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
l m
x
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
r
m
x
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
Tìm thấy x tại
vị trí 6
Minh họa tìm x = 45
11
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
x
m

3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
m
x
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
r
m
x
l
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
m
x
3 14 16 19 22 41 46 51 63 71
2 3 4 5 6 7 8 9 : 2;
l > r: Kết thúc:
Không tìm thấy
Giải thuật
D%2,EFG2H GIHJJ/)1K+.
D%3,
G@EFL BJ3HJJ"+
M"+*NO>%P'(4)Q ,

*NOGP,/RS 

*NOTP, JJ/1P" "*
EF
*
U2

 GU2H

*NOVP, JJ/1P" "*
L2
*
 

EFGL2H
D%4,
I1EFVG  JJW.*PC/1
XY=D%3
I =,RS JJZPC1+.
12

Cài đặt
int BinarySearch(int a[],int N,int x )
{ int left =0; right = N-1;
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
}


Ðánh giá giải thuật
Độ phức tạp tính toán cấp n: T(n)=O(log
2
n)
13

×