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đầutừphầntửđầutiêncủadãy
Bước 2:
Sosánha[i]vớix, có2khảnăng:
a[i]=x:Tìmthấy.Dừng
a[i]!=x:SangBước3.
Bước 3:
i=i+1;//xéttiếpphầntửkếtrongmảng
Nếui>N:Hếtmảng,khôngtìmthấy.Dừng
Ngượclại:LặplạiBước2.
4
Cài đặt
intLinearSearch(inta[],intN,intx)
{
inti=0;
while((i<N)&&(a[i]!=x))
i++;
if(i==N)
return-1;//tìmhếtmảngnhưngkhôngcóx
else
returni;//a[i]làphầntửcókhoáx
}
5
01@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ầntử“línhcanh”
Bước 2:
Sosánha[i]vớix, có2khảnăng:
a[i]=x:sangbước3
a[i]!=x:i=i+1;
Bước 3:
Nếui≤N:tìmthấyxtạivịtríi.
Ngượclại:khôngtìmthấyxtrongdãy.
7
Cài đặt
int LinearSearch2(int a[],int N,int x)
{ inti=0; //mảnggồmNphầntửtừa[0] a[N-1]
a[N]=x;//thêmphầntửthứN+1
while(a[i]!=x)
i++;
if(i==N)
return-1; //tìmhếtmảngnhưngkhôngcóx
else
returni; //tìmthấyxtạivị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,EFG2H GIHJJ/)1K+.
D%3,
G@EFL BJ3HJJ"+
M"+*NO>%P'(4)Q ,
*NOGP,/RS
*NOTP, JJ/1P" "*
EF
*
U2
GU2H
*NOVP, JJ/1P" "*
L2
*
EFGL2H
D%4,
I1EFVG JJW.*PC/1
XY=D%3
I =,RS JJZPC1+.
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