Вы находитесь на странице: 1из 22

Chng 4: TM KIM

(SEARCHING)
Chng 3: Tm kim
Ni dung
1. Khi qut v tm kim
2. Tm tuyn tnh (Linear Search)
3. Tm nh phn (Binary Search)



2
Chng 3: Tm kim
Khi qut v tm kim
Tm kim l mt yu cu rt thng xuyn trong i
sng hng ngy cng nh trong tin hc
V d:
Tm kim mt sinh vin trong lp
Tm kim mt tp tin, th mc trong my
n gin ta xt bi ton tm kim nh sau:
Cho mt dy s gm cc phn t a
1
, a
2
, ..., a
n
. Cho bit
trong dy ny c phn t no c gi tr bng X (cho trc)
hay khng?
3
Chng 3: Tm kim
Chng 3: Tm kim
Khi qut v tm kim
Xt hai cch tm kim:
Tm kim tuyn tnh (Linear Search) hay cn gi l tm
kim tun t (Sequential Search)
Tm kim nh phn (Binary Search)
4
Chng 3: Tm kim
Ni dung
1. Khi qut v tm kim
2. Tm tuyn tnh (Linear Search)
3. Tm nh phn (Binary Search)



5
Chng 3: Tm kim
2. Tm tuyn tnh (Linear Seach)
tng:
Bt u t phn t u tin ca danh sch, so snh ln
lt tng phn t ca danh sch vi gi tr X cn tm
Nu c phn t bng X, thut ton dng li (thnh cng)
Nu n cui danh sch m khng c phn t no bng X,
thut ton dng li (khng thnh cng)

If we find a match, the search terminates successfully by
returning the index of the element
If the end of the list is encountered without a match, the
search terminates unsuccessfully


6
Chng 3: Tm kim
2. Tm tuyn tnh (Linear Seach)
Thut ton:
B1: i = 0 ; // bt u t phn t u tin
B2: so snh A[i] vi X, c 2 kh nng :
A[i] = X : Tm thy. Dng
A[i] X : Sang B3
B3: i=i+1 // Xt phn t tip theo trong mng
Nu i=n : Ht mng, khng tm thy. Dng
Ngc li: lp li B2
7
Chng 3: Tm kim
2. Tm tuyn tnh (Linear Seach)
9
5
Kha tm
7 13 5 21 6 2 8 15
0 1 2 3 4 5 6 7
V tr = 2
Tm thnh cng
S ln so snh: 3
Chng 3: Tm kim
10
9
7 13 5 21 6 2 8 15
0 1 2 3 4 5 6 7
Khng tm thy
S ln so snh: 8
Kha tm
2. Tm tuyn tnh (Linear Seach)
Chng 3: Tm kim
2. Tm tuyn tnh (Linear Seach)
void lsearch (int list[], int n, int key) {
int flag = 0; // gi s lc u cha tm thy
for(int i=0; i<n; i++)
if (list[i] == key) {
cout<<found at position<<i;
flag =1; // tm thy
break;
}
if (flag == 0)
cout<<not found;
}
11
Chng 3: Tm kim
2. Tm tuyn tnh (Linear Seach)
int lsearch(int list[], int n, int key)
{
int find= -1;
for(int i=0; i<n; i++)
if (list[i] == key)
{
find = i;
break;
}
return find;
}
12
Chng 3: Tm kim
Phn tch, nh gi thut ton





Vy gii thut tm tuyn tnh c phc tp tnh ton
cp n: T(n) = O(n)
13
Trng hp S ln so snh Gii thch
Tt nht 1 Phn t u tin c gi tr x
Xu nht n+1 Phn t cui cng c gi tr x
Trung bnh (n+1)/2
Gi s xc sut cc phn t trong mng
nhn gi tr x l nh nhau.
Chng 3: Tm kim
Tm tuyn tnh (Linear Seach)
Phn tch, nh gi thut ton:








14
Trng hp S ln so snh Gii thch
Tt nht 1 Phn t u tin c gi tr x
Xu nht n+1 Phn t cui cng c gi tr x
Trung bnh (n+1)/2
Gi s xc sut cc phn t trong mng
nhn gi tr x l nh nhau.
Chng 3: Tm kim
Ni dung
1. Khi qut v tm kim
2. Tm tuyn tnh (Linear Search)
3. Tm nh phn (Binary Search)



15
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
iu kin:
Danh sch phi c sp xp trc
tng:
So snh gi tr mun tm X vi phn t nm v tr gia
ca danh sch:
Nu bng, tm kim dng li (thnh cng)
Nu X ln hn th tip tc tm kim phn danh sch bn phi
phn t gia
Nu X nh hn th tip tc tm kim phn danh sch bn tri
phn t gia
We compare the element with the element placed approximately in the middle of the list
If a match is found, the search terminates successfully
Otherwise, we continue the search for the key in a similar manner either in the upper half
or the lower half
16
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
Thut ton:
B1: Left = 0, Right = n-1
B2: Mid = (Left + Right)/2 // ly v tr cn gia
B3: So snh X vi A[Mid], c 3 kh nng xy ra:
A[Mid] = X // tm thy. Dng thut ton
A[Mid] > X
Right = Mid-1 // Tip tc tm trong dy A[0] A[Mid-1]
A[Mid] < X
Left = Mid+1 // Tip tc tm trong dy A[Mid+1] A[Right]
B4: Nu (Left <= Right) // Cn phn t cha xt
Lp li B2
Ngc li: Kt thc
17
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
18
10
Kha tm
2 5 8 10 12 13 15 18 21 24
0 1 2 3 4 5 6 7 8 9
left right mid
Vi tr = 3
Tm thy
S ln so snh: 4
Kha cn tm nh hn hoc bng Kha cn tm ln hn Kha cn tm bng
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
void BSearch (int list[], int n, int key)
{
int left, right, mid, flag = 0;
left = 0; right = n-1;
while (left <= right) {
mid = (left + right)/2;
if( list[mid] == key) {
cout<<"found:"<< mid;
flag =1; // nh du tm thy
break;
}
else if (list[mid] < key) left = mid +1;
else
right = mid -1;
}
if (flag == 0)
cout<<"not found";
}
20
Khng quy
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
int BSearch_Recursion (int list[], int key, int left, int right)
{
if (left <= right)
{
int mid = (left + right)/2;
if (key == list[mid])
return mid; // tr v v tr tm thy key
else if (key < list[mid])
return BSearch_Recursion (list, key, left, mid-1);
else return BSearch_Recursion (list, key, mid+1, right);
}
return -1; // khng tm thy
}
21
quy
Chng 3: Tm kim
3. Tm nh phn (Binary Seach)
Phn tch, nh gi thut ton:






Vy gii thut tm nh phn c phc tp tnh ton
cp n: T(n) = O(log
2
n)
22
Trng hp S ln so snh Gii thch
Tt nht 1 Phn t gia ca mng c gi tr x
Xu nht log
2
n Khng c x trong mng
Trung bnh log
2
(n/2)
Gi s xc sut cc phn t trong mng
nhn gi tr x l nh nhau
Chng 3: Tm kim
Nhn xt
Tm Tuyn Tnh khng ph thuc vo th t ca cc
phn t, do vy y l phng php tng qut nht
tm kim trn mt dy bt k
Tm Nh Phn da vo quan h gi tr ca cc phn t
mng nh hng trong qu trnh tm kim, do vy
ch p dng c cho nhng dy c th t
Gii thut Tm Nh Phn tit kim thi gian hn rt nhiu
so vi gii thut Tm Tuyn Tnh do:
T
nh phn
(n) = O(log
2
n) < T
tuyn tnh
(n) = O(n)

23
Chng 3: Tm kim
Nhn xt
Tuy nhin khi mun p dng gii thut tm Nh Phn cn
phi xt n thi gian sp xp dy s tha iu kin
dy s c th t
Thi gian ny khng nh, v khi dy s bin ng cn
phi tin hnh sp xp li
Tt c cc nhu cu to ra khuyt im chnh cho gii
thut tm Nh Phn
Ta cn cn nhc nhu cu thc t chn mt trong hai
gii thut tm kim trn sao cho c li nht
24

Вам также может понравиться