<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
CH
ƯƠ
NG 3
S
Ắ
P X
Ế
P VÀ TÌM KI
Ế
M NÂNG CAO
GV. Ngô Công Th
ắ
ng
B
ộ
môn Công ngh
ệ
ph
ầ
n m
ề
m
Khoa Công ngh
ệ
thông tin
Website: dse.vnua.edu.vn/ncthang
Email:
N
ộ
i dung Ch
ươ
ng 3
1. S
ắ
p x
ế
p nhanh (Quick Sort)
2. S
ắ
p x
ế
p vun
đố
ng (Heap Sort)
3. S
ắ
p x
ế
p hịa nh
ậ
p (Merge Sort)
4. Tìm ki
ế
m nh
ị
phân
</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>
1. S
ắ
p x
ế
p nhanh (Quick Sort)
1.1. Ph
ươ
ng pháp
• S
ắ
p
x
ế
p
nhanh
(quick sort) còn
đượ
c
s
ắ
p
x
ế
p phân
đ
o
ạ
n (partition sort).
•
Ý t
ưở
ng thu
ậ
t tốn:
– Ch
ọ
n ng
ẫ
u nhiên m
ộ
t ph
ầ
n t
ử
x.
– Duy
ệ
t t
ừ
bên trái m
ả
ng cho t
ớ
i khi có m
ộ
t ph
ầ
n t
ử
a
<sub>i</sub>
>
=
x
– Sau
đ
ó duy
ệ
t t
ừ
bên ph
ả
i m
ả
ng cho t
ớ
i khi có m
ộ
t
ph
ầ
n t
ử
aj
=
<x
–
Đổ
i ch
ỗ
a
<sub>i</sub>
và a
<sub>j</sub>
– Ti
ế
p t
ụ
c duy
ệ
t và
đổ
i ch
ỗ
cho t
ớ
i khi 2 phía g
ặ
p nhau.
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.3
1.1. Ph
ươ
ng pháp (
<i>ti</i>
<i>ế</i>
<i>p</i>
)
• K
ế
t qu
ả
m
ả
ng
đượ
c
chia thành 2 ph
ầ
n:
</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>
Th
ủ
t
ụ
c s
ắ
p x
ế
p nhanh
Procedure Q_sort(L,R);
1) If L>=R then return;
2) i:=L; j:=R ; k:=(L+R) div 2;
3) x:=a[k];
4) Repeat
While a[i] <x Do i:=i+1;
While a[j] >x Do j:=j-1;
If i<j then a[i]
↔
a[j]
Until i=j
5) Call Q_sort(L,j-1); { Th
ự
c hi
ệ
n trên n
ử
a <x }
6) Call Q_sort(j+1,R); { Th
ự
c hi
ệ
n trên n
ử
a >x }
Return
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.5
1.2.
Đ
ánh giá
•
Ng
ườ
i ta
đ
ã ch
ứ
ng minh
đượ
c th
ờ
i gian trung
bình th
ự
c hi
ệ
n gi
ả
i thu
ậ
t là:
T
<sub>tb</sub>
= O(nlog
<sub>2</sub>
n)
•
Nh
ư
v
ậ
y, v
ớ
i n khá l
ớ
n Quick sort có hi
ệ
u l
ự
c
</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>
2. S
ắ
p x
ế
p vun
đố
ng (Heap Sort)
2.1. Ph
ươ
ng pháp
•
M
ộ
t cây nh
ị
phân có chi
ề
u cao h
đượ
c g
ọ
i là
đố
ng khi:
–
Là cây nh
ị
phân hoàn ch
ỉ
nh mà các nút lá
ở
m
ứ
c
h-1 ph
ả
i n
ằ
m phía bên trái.
–
Khoá
ở
nút cha bao gi
ờ
c
ũ
ng l
ớ
n h
ơ
n khố
ở
nút
con.
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.7
2. S
ắ
p x
ế
p vun
đố
ng (Heap Sort)
2.1. Ph
ươ
ng pháp
•
Thu
ậ
t tốn s
ắ
p x
ế
p vun
đố
ng chia làm 2 giai
đ
o
ạ
n.
</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5></div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6></div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>
- L
ặ
p l
ạ
i các b
ướ
c t
ươ
ng t
ự
cho các cây còn l
ạ
i.
Cu
ố
i cùng ta thu
đượ
c dãy
đ
ã s
ắ
p là s=(11, 23, 42, 58, 65,
74)
* Gi
ả
i thu
ậ
t vun
đố
ng:
- M
ộ
t lá coi nh
ư
cây con là m
ộ
t
đố
ng.
- Thu
ậ
t toán ti
ế
n hành t
ừ
đ
áy lên: Chuy
ể
n
đổ
i thành
đố
ng
cho m
ộ
t cây con mà cây con trái và cây con ph
ả
i c
ủ
a g
ố
c
đ
ã
là m
ộ
t
đố
ng.
Cây nh
ị
phân hoàn ch
ỉ
nh có n nút thì v
ớ
i ch
ỉ
s
ố
[n/2] tr
ở
lên
có th
ể
là nút cha: [n/2], [n/2 ]-1, . . . , 1.
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.13
<b>a) Th</b>
<b>ủ</b>
<b> t</b>
<b>ụ</b>
<b>c vun </b>
<b>đố</b>
<b>ng:</b>
<b>Ch</b>
<b>ỉ</b>
<b>nh lý cây nh</b>
<b>ị</b>
<b> phân con hoàn ch</b>
<b>ỉ</b>
<b>nh g</b>
<b>ố</b>
<b>c i trên cây nh</b>
<b>ị</b>
<b>phân có n nút </b>
<b>để</b>
<b> tr</b>
<b>ở</b>
<b> thành “</b>
<b>đố</b>
<b>ng” v</b>
<b>ớ</b>
<b>i </b>
<b>đ</b>
<b>i</b>
<b>ề</b>
<b>u ki</b>
<b>ệ</b>
<b>n cây con </b>
<b>trái và cây con ph</b>
<b>ả</b>
<b>i có g</b>
<b>ố</b>
<b>c là 2i và 2i+1 </b>
<b>đ</b>
<b>ã là </b>
<b>đố</b>
<b>ng.</b>
<b>Procedure ADJUST(i,n)</b>
<b>1. { Kh</b>
<b>ở</b>
<b>i </b>
<b>đầ</b>
<b>u }</b>
<b>Key:=K[i]; j:=2*i;</b>
<b>2. { Ch</b>
<b>ọ</b>
<b>n con </b>
<b>ứ</b>
<b>ng v</b>
<b>ớ</b>
<b>i khoá l</b>
<b>ớ</b>
<b>n nh</b>
<b>ấ</b>
<b>t trong 2 con c</b>
<b>ủ</b>
<b>a i }</b>
<b>While j<=n Do </b>
<b>Begin</b>
</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>
<b>a) Th</b>
<b>ủ</b>
<b> t</b>
<b>ụ</b>
<b>c vun </b>
<b>đố</b>
<b>ng:</b>
<b>3. { So sánh khoá cha v</b>
<b>ớ</b>
<b>i khoá l</b>
<b>ớ</b>
<b>n nh</b>
<b>ấ</b>
<b>t }</b>
<b>If Key > K[j] then Begin</b>
<b>K[j/2]:=Key;</b>
<b>Return;</b>
<b>End;</b>
<b>K[j/2]:=K[j]; j:=2*j;</b>
<b>End; {K</b>
<b>ế</b>
<b>t thúc while}</b>
<b>4. { </b>
<b>Đư</b>
<b>a Key vào v</b>
<b>ị</b>
<b> trí c</b>
<b>ủ</b>
<b>a nó }</b>
<b>K[j/2]:=Key;</b>
<b>5. Return;</b>
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.15
<b>b) Th</b>
<b>ủ</b>
<b> t</b>
<b>ụ</b>
<b>c s</b>
<b>ắ</b>
<b>p x</b>
<b>ế</b>
<b>p vun </b>
<b>đố</b>
<b>ng:</b>
Procedure Heap_Sort(K,n)
1. { T
ạ
o
đố
ng ban
đầ
u }
For i:=[n/2] Downto 1 Do
Call ADJUST(i,n)
2. { S
ắ
p x
ế
p }
For i:= n-1 Downto 1 Do
Begin
tg:=K[1]; K[1]:=K[i+1];
K[i+1]:=tg;
Call ADJUST(1,i);
End;
3. Return
<b>5.2. </b>
<b>Đ</b>
<b>ánh giá</b>
</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>
<b>3. S</b>
<b>ắ</b>
<b>p x</b>
<b>ế</b>
<b>p ki</b>
<b>ể</b>
<b>u hoà nh</b>
<b>ậ</b>
<b>p ( MERGE SORT)</b>
<b>3.1. Phép hoà nh</b>
<b>ậ</b>
<b>p 2 </b>
<b>đườ</b>
<b>ng</b>
Th
ự
c hi
ệ
n h
ợ
p nh
ấ
t các b
ả
n ghi c
ủ
a 2 b
ả
ng
đ
ã
đượ
c s
ắ
p
x
ế
p thành 1 b
ả
ng
đượ
c s
ắ
p.
<b>a) Ph</b>
<b>ươ</b>
<b>ng pháp:</b>
So sánh 2 khoá nh
ỏ
nh
ấ
t ( ho
ặ
c l
ớ
n nh
ấ
t c
ủ
a 2 b
ả
ng)
để
đư
a vào mi
ề
n s
ắ
p x
ế
p.
Quá trình c
ứ
ti
ế
p t
ụ
c cho t
ớ
i khi 2 b
ả
ng
đ
ã c
ạ
n.
<b>b) Gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t:</b>
B
ả
ng 1: (x
<sub>b</sub>
, ..., x
<sub>m</sub>
)
B
ả
ng 2: (x
<sub>m+1</sub>
, ..., x
<sub>n</sub>
)
B
ả
ng s
ắ
p: (z
<sub>b</sub>
, ..., z
<sub>n</sub>
)
Ví d
ụ
: B
ả
ng 1: (3, 5, 10, 16 )
B
ả
ng 2: (1, 4, 15 )
B
ả
ng s
ắ
p: (1, 3, 4, 5, 10, 15, 16)
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.17
<b>* Th</b>
<b>ủ</b>
<b> t</b>
<b>ụ</b>
<b>c nh</b>
<b>ư</b>
<b> sau:</b>
<b>Procedure MERGE(X,b,m,n,Z);</b>
<b>1. i:=k:=b; j:=m+1;</b>
<b>2. While (i<=m) and (j<=n) Do </b>
<b>Begin If x[i]<=x[j] then </b>
<b>Begin Z[k]:=x[i];</b>
<b>i:=i+1;</b>
<b>End</b>
<b>Else Begin z[k]:=x[j];</b>
<b>j:=j+1;</b>
<b>End;</b>
</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>
<b>* Th</b>
<b>ủ</b>
<b> t</b>
<b>ụ</b>
<b>c nh</b>
<b>ư</b>
<b> sau:</b>
<b>3. { M</b>
<b>ộ</b>
<b>t trong 2 b</b>
<b>ả</b>
<b>ng con </b>
<b>đ</b>
<b>ã c</b>
<b>ạ</b>
<b>n }</b>
<b>If i>m then (zk, ..., zn):= (xj, ..., xn)</b>
<b>Else (zk, ..., zn):= (xi, ..., xm)</b>
<b>4. Return</b>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.19
3.2. S
ắ
p x
ế
p ki
ể
u hòa nh
ậ
p tr
ự
c ti
ế
p (Straight two way
merge )
* B
ả
ng con
đ
ã
đượ
c s
ắ
p g
ọ
i là m
ộ
t m
ạ
ch ( run).
* M
ỗ
i b
ả
n ghi coi nh
ư
1 m
ạ
ch có
độ
dài ( kích th
ướ
c )
là 1. N
ế
u hồ nh
ậ
p 2 b
ả
ng nh
ư
v
ậ
y ta
đượ
c 1 m
ạ
ch
m
ớ
i có
độ
dài =2. Hồ nh
ậ
p 2 m
ạ
ch có
độ
dài là 2 ta
đượ
c m
ộ
t m
ạ
ch có
độ
dài là 4, ...
* Th
ủ
t
ụ
c MPASS th
ự
c hi
ệ
n m
ộ
t b
ướ
c c
ủ
a s
ắ
p x
ế
p
hồ nh
ậ
p. Nó hịa nh
ậ
p t
ừ
ng c
ặ
p m
ạ
ch k
ề
c
ậ
n nhau,
có
độ
dài L, t
ừ
b
ả
ng X sang b
ả
ng Y, n là s
ố
l
ượ
ng
</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>
Procedure MPASS(X,Y,n,L)
1. i:=1;
2. Hồ nh
ậ
p c
ặ
p m
ạ
ch có
độ
dài L }
While i<= n-(2L-1) Do
Begin Call MERGE(X,i,i+L-1,i+2L-1, Y)
i:=i+2L;
End;
3. { Hồ nh
ậ
p c
ặ
p m
ạ
ch cịn l
ạ
i cu
ố
i cùng
v
ớ
i t
ổ
ng
độ
dài <2L}
If i+L-1 <n then Call MERGE(X,i,i+L-1,n,Y)
Else (y
<sub>i</sub>
, ..., y
<sub>n</sub>
):= (x
<sub>i</sub>
, ..., x
<sub>n</sub>
);
Return
</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>
3.3.
Đ
ánh giá
Th
ờ
i gian th
ự
c hi
ệ
n trung bình c
ủ
a gi
ả
i thu
ậ
t là:
Ttb = O(nlog
<sub>2</sub>
n)
* Nh
ậ
n xét chung:
- V
ớ
i n nh
ỏ
có th
ể
dùng các ph
ươ
ng pháp:
ch
ọ
n tr
ự
c ti
ế
p, chèn tr
ự
c ti
ế
p,
đổ
i ch
ỗ
tr
ự
c
ti
ế
p.
- V
ớ
i n l
ớ
n: N
ế
u dãy khố khơng s
ắ
p dùng
Quick sort, n
ế
u dãy khố có s
ắ
p dùng Heap
sort.
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.23
<b>4. Tìm ki</b>
<b>ế</b>
<b>m nh</b>
<b>ị</b>
<b> phân</b>
<b>Bài tốn tìm ki</b>
<b>ế</b>
<b>m</b>
* Bài tốn tìm ki
ế
m
đượ
c phát bi
ể
u nh
ư
sau:
Cho m
ộ
t b
ả
ng g
ồ
m n b
ả
n ghi r
<sub>1</sub>
, r
<sub>2</sub>
, . . . , r
<sub>n</sub>
; r
<sub>i</sub>
(
1<= i <=n ) t
ươ
ng
ứ
ng v
ớ
i m
ộ
t khố k
<sub>i</sub>
. Hãy tìm
b
ả
n ghi có giá tr
ị
khố t
ươ
ng
ứ
ng b
ằ
ng x cho
tr
ướ
c.
</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>
<b>1- Tìm </b>
<b>đượ</b>
<b>c b</b>
<b>ả</b>
<b>n ghi có giá tr</b>
<b>ị</b>
<b> khố t</b>
<b>ươ</b>
<b>ng </b>
<b>ứ</b>
<b>ng </b>
<b>b</b>
<b>ằ</b>
<b>ng x. Lúc </b>
<b>đ</b>
<b>ó ta nói phép tìm ki</b>
<b>ế</b>
<b>m </b>
<b>đượ</b>
<b>c tho</b>
<b>ả</b>
<b>. </b>
<b>2- Khơng tìm </b>
<b>đượ</b>
<b>c b</b>
<b>ả</b>
<b>n ghi nào có giá tr</b>
<b>ị</b>
<b> khố b</b>
<b>ằ</b>
<b>ng </b>
<b>x . Khi </b>
<b>đ</b>
<b>ó ta nói phép tìm ki</b>
<b>ế</b>
<b>m khơng tho</b>
<b>ả</b>
<b>.</b>
<b>Sau phép tìm ki</b>
<b>ế</b>
<b>m khơng tho</b>
<b>ả</b>
<b> n</b>
<b>ế</b>
<b>u có u c</b>
<b>ầ</b>
<b>n b</b>
<b>ổ</b>
<b>sung b</b>
<b>ả</b>
<b>n ghi m</b>
<b>ớ</b>
<b>i có khố x vào b</b>
<b>ả</b>
<b>ng. Gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t </b>
<b>này g</b>
<b>ọ</b>
<b>i là “ Tìm ki</b>
<b>ế</b>
<b>m có b</b>
<b>ổ</b>
<b> sung”.</b>
<b>Khố c</b>
<b>ủ</b>
<b>a m</b>
<b>ỗ</b>
<b>i b</b>
<b>ả</b>
<b>n ghi chính là </b>
<b>đặ</b>
<b>c </b>
<b>đ</b>
<b>i</b>
<b>ể</b>
<b>m nh</b>
<b>ậ</b>
<b>n bi</b>
<b>ế</b>
<b>t </b>
<b>c</b>
<b>ủ</b>
<b>a b</b>
<b>ả</b>
<b>n ghi </b>
<b>đ</b>
<b>ó trong tìm ki</b>
<b>ế</b>
<b>m, ta coi nó là </b>
<b>đạ</b>
<b>i di</b>
<b>ệ</b>
<b>n </b>
<b>c</b>
<b>ủ</b>
<b>a b</b>
<b>ả</b>
<b>n ghi trong gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t.</b>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.25
<b>4.1. Ý t</b>
<b>ưở</b>
<b>ng gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t</b>
<b>* Ph</b>
<b>ươ</b>
<b>ng pháp tìm ki</b>
<b>ế</b>
<b>m th</b>
<b>ự</b>
<b>c hi</b>
<b>ệ</b>
<b>n trên dãy khóa</b>
<b>đ</b>
<b>ã</b>
<b>s</b>
<b>ắ</b>
<b>p x</b>
<b>ế</b>
<b>p, có n</b>
<b>ộ</b>
<b>i dung nh</b>
<b>ư</b>
<b>sau:</b>
<b>- T</b>
<b>ươ</b>
<b>ng t</b>
<b>ự</b>
<b>nh</b>
<b>ư</b>
<b>tra tìm t</b>
<b>ừ</b>
<b>trong t</b>
<b>ừ đ</b>
<b>i</b>
<b>ể</b>
<b>n ho</b>
<b>ặ</b>
<b>c danh</b>
<b>b</b>
<b>ạ đ</b>
<b>i</b>
<b>ệ</b>
<b>n tho</b>
<b>ạ</b>
<b>i. Ch</b>
<b>ỉ</b>
<b>khác là trong tra c</b>
<b>ứ</b>
<b>u ta ch</b>
<b>ọ</b>
<b>n t</b>
<b>ừ</b>
<b>ng</b>
<b>ẫ</b>
<b>u nhiên, cịn trong tìm ki</b>
<b>ế</b>
<b>m nh</b>
<b>ị</b>
<b>phân ln ch</b>
<b>ọ</b>
<b>n</b>
<b>khố “</b>
<b>ở</b>
<b> gi</b>
<b>ữ</b>
<b>a” d</b>
<b>ẫ</b>
<b>y khố.</b>
<b>- Gi</b>
<b>ả</b>
<b>s</b>
<b>ử</b>
<b>có dãy khố k</b>
<b><sub>L</sub></b>
<b>, . . ., k</b>
<b><sub>R</sub></b>
<b>thì khố</b>
<b>ở</b>
<b> gi</b>
<b>ữ</b>
<b>a là</b>
<b>k</b>
<b><sub>i</sub></b>
<b>v</b>
<b>ớ</b>
<b>i</b>
</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>
<b>+ Tìm ki</b>
<b>ế</b>
<b>m s</b>
<b>ẽ</b>
<b> k</b>
<b>ế</b>
<b>t thúc n</b>
<b>ế</b>
<b>u: x=k</b>
<b><sub>i</sub></b>
<b>+ N</b>
<b>ế</b>
<b>u x<k</b>
<b><sub>i</sub></b>
<b>tìm ki</b>
<b>ế</b>
<b>m s</b>
<b>ẽ</b>
<b>đượ</b>
<b>c th</b>
<b>ự</b>
<b>c hi</b>
<b>ệ</b>
<b>n ti</b>
<b>ế</b>
<b>p </b>
<b>v</b>
<b>ớ</b>
<b>i k</b>
<b><sub>L</sub></b>
<b>, . . . , k</b>
<b><sub>i-1</sub></b>
<b>v</b>
<b>ớ</b>
<b>i cách t</b>
<b>ươ</b>
<b>ng t</b>
<b>ự</b>
<b>.</b>
<b>+ N</b>
<b>ế</b>
<b>u x>k</b>
<b><sub>i</sub></b>
<b>tìm ki</b>
<b>ế</b>
<b>m s</b>
<b>ẽ</b>
<b>đượ</b>
<b>c th</b>
<b>ự</b>
<b>c hi</b>
<b>ệ</b>
<b>n ti</b>
<b>ế</b>
<b>p </b>
<b>v</b>
<b>ớ</b>
<b>i k</b>
<b><sub>i+1</sub></b>
<b>, . . . , k</b>
<b><sub>r</sub></b>
<b>v</b>
<b>ớ</b>
<b>i cách t</b>
<b>ươ</b>
<b>ng t</b>
<b>ự</b>
<b>.</b>
<b>Qúa trình tìm ki</b>
<b>ế</b>
<b>m k</b>
<b>ế</b>
<b>t thúc khi tìm th</b>
<b>ấ</b>
<b>y m</b>
<b>ộ</b>
<b>t </b>
<b>khố mong mu</b>
<b>ố</b>
<b>n ho</b>
<b>ặ</b>
<b>c dãy khố r</b>
<b>ỗ</b>
<b>ng</b>
<b>( khơng tìm th</b>
<b>ấ</b>
<b>y ).</b>
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.27
<b>* Gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t:</b>
<b>Cho dãy K g</b>
<b>ồ</b>
<b>m n khoá, s</b>
<b>ắ</b>
<b>p x</b>
<b>ế</b>
<b>p theo th</b>
<b>ứ</b>
<b> t</b>
<b>ự</b>
<b> t</b>
<b>ă</b>
<b>ng d</b>
<b>ầ</b>
<b>n. Tìm khố có </b>
<b>giá tr</b>
<b>ị</b>
<b> =x.</b>
<b>Dùng bi</b>
<b>ế</b>
<b>n L, R, m: ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b>đầ</b>
<b>u, ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b> cu</b>
<b>ố</b>
<b>i, ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b> gi</b>
<b>ữ</b>
<b>a c</b>
<b>ủ</b>
<b>a khố k.</b>
<b>N</b>
<b>ế</b>
<b>u tìm th</b>
<b>ấ</b>
<b>y cho ra ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b> c</b>
<b>ủ</b>
<b>a khố </b>
<b>đ</b>
<b>ó, n</b>
<b>ế</b>
<b>u khơng tìm th</b>
<b>ấ</b>
<b>y cho ra </b>
<b>0.</b>
<b>Function Binary_search(K,n,x)</b>
<b>1. { Kh</b>
<b>ở</b>
<b>i t</b>
<b>ạ</b>
<b>o }</b>
<b>L:=1; R:=n;</b>
<b>2. { Tìm ki</b>
<b>ế</b>
<b>m }</b>
<b>While L<= R Do</b>
<b>Begin</b>
</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>
<b>4. { So sánh }</b>
<b>If x<k[m] then R:=m-1</b>
<b>Else IF x>k[m] then L:=m+1</b>
<b>Else Return (m);</b>
<b>End; {End of While}</b>
<b>5. { Khơng tìm th</b>
<b>ấ</b>
<b>y }</b>
<b>Return (0)</b>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.29
<b>* Gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t vi</b>
<b>ế</b>
<b>t d</b>
<b>ạ</b>
<b>ng </b>
<b>đệ</b>
<b> quy nh</b>
<b>ư</b>
<b> sau:</b>
<b>L, r là ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b>đầ</b>
<b>u, ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b> cu</b>
<b>ố</b>
<b>i c</b>
<b>ủ</b>
<b>a dãy K, bi</b>
<b>ế</b>
<b>n nguyên Loc </b>
<b>để</b>
<b>đư</b>
<b>a ra ch</b>
<b>ỉ</b>
<b> s</b>
<b>ố</b>
<b>ứ</b>
<b>ng v</b>
<b>ớ</b>
<b>i khố c</b>
<b>ầ</b>
<b>n tìm, n</b>
<b>ế</b>
<b>u khơng tìm </b>
<b>th</b>
<b>ấ</b>
<b>y thì Loc =0.</b>
<b>Function Binary_search(L,R,x)</b>
<b>1. If L>R then Loc:=0</b>
<b>Else </b>
<b>begin m:=(L+R) div 2;</b>
<b>If x<k[m] then </b>
<b>Loc:=Binary_search(L,m-1,x)</b>
<b>Else If x>k[m] then </b>
<b>Loc:=Binary_search(m+1,R,x)</b>
<b>Else Loc:=m;</b>
<b>end;</b>
</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>
<b>4.2. </b>
<b>Đ</b>
<b>ánh giá</b>
<b>Phép tính tích c</b>
<b>ự</b>
<b>c là phép so sánh</b>
<b>L<= r</b>
<b>C</b>
<b><sub>min</sub></b>
<b>=1</b>
<b>Ng</b>
<b>ườ</b>
<b>i ta </b>
<b>đ</b>
<b>ã tính </b>
<b>đượ</b>
<b>c </b>
<b>C</b>
<b><sub>max</sub></b>
<b>=[log</b>
<b><sub>2</sub></b>
<b>n ]</b>
<b>T</b>
<b><sub>tb</sub></b>
<b>=O(log</b>
<b><sub>2</sub></b>
<b>n )</b>
<b>Tìm ki</b>
<b>ế</b>
<b>m nh</b>
<b>ị</b>
<b> phân t</b>
<b>ố</b>
<b>t h</b>
<b>ơ</b>
<b>n tìm ki</b>
<b>ế</b>
<b>m tu</b>
<b>ầ</b>
<b>n t</b>
<b>ự</b>
<b>nh</b>
<b>ư</b>
<b>ng dãy k ph</b>
<b>ả</b>
<b>i </b>
<b>đượ</b>
<b>c s</b>
<b>ắ</b>
<b>p.</b>
Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.31
<b>5. Cây nh</b>
<b>ị</b>
<b> phân tìm ki</b>
<b>ế</b>
<b>m</b>
<b>5.1. </b>
<b>Đị</b>
<b>nh ngh</b>
<b>ĩ</b>
<b>a cây nh</b>
<b>ị</b>
<b> phân tìm ki</b>
<b>ế</b>
<b>m</b>
<b>* Cây nh</b>
<b>ị</b>
<b> phân tìm ki</b>
<b>ế</b>
<b>m </b>
<b>ứ</b>
<b>ng v</b>
<b>ớ</b>
<b>i n khoá k</b>
<b><sub>1</sub></b>
<b>, k</b>
<b><sub>2</sub></b>
<b>, ..., k</b>
<b><sub>n</sub></b>
<b>là m</b>
<b>ộ</b>
<b>t </b>
<b>cây nh</b>
<b>ị</b>
<b> phân mà m</b>
<b>ỗ</b>
<b>i nút c</b>
<b>ủ</b>
<b>a nó </b>
<b>đề</b>
<b>u </b>
<b>đượ</b>
<b>c </b>
<b>đị</b>
<b>nh danh b</b>
<b>ở</b>
<b>i </b>
<b>m</b>
<b>ộ</b>
<b>t khố nào </b>
<b>đ</b>
<b>ó trong các khố </b>
<b>đ</b>
<b>ã cho. </b>
<b>Đố</b>
<b>i v</b>
<b>ớ</b>
<b>i m</b>
<b>ọ</b>
<b>i nút </b>
<b>trên cây tính ch</b>
<b>ấ</b>
<b>t sau </b>
<b>đ</b>
<b>ây ln </b>
<b>đượ</b>
<b>c tho</b>
<b>ả</b>
<b> mãn:</b>
<b>- M</b>
<b>ọ</b>
<b>i khố thu</b>
<b>ộ</b>
<b>c cây con trái c</b>
<b>ủ</b>
<b>a m</b>
<b>ộ</b>
<b>t nút </b>
<b>đề</b>
<b>u nh</b>
<b>ỏ</b>
<b>h</b>
<b>ơ</b>
<b>n </b>
<b>khoá </b>
<b>ứ</b>
<b>ng v</b>
<b>ớ</b>
<b>i nút </b>
<b>đ</b>
<b>ó.</b>
<b>- M</b>
<b>ọ</b>
<b>i khố thu</b>
<b>ộ</b>
<b>c cây con ph</b>
<b>ả</b>
<b>i c</b>
<b>ủ</b>
<b>a m</b>
<b>ộ</b>
<b>t nút </b>
<b>đề</b>
<b>u l</b>
<b>ớ</b>
<b>n h</b>
<b>ơ</b>
<b>n</b>
<b>khố </b>
<b>ứ</b>
<b>ng v</b>
<b>ớ</b>
<b>i nút </b>
<b>đ</b>
<b>ó.</b>
<b>Chú ý : Khố là s</b>
<b>ố</b>
<b> thì so sánh s</b>
<b>ố</b>
<b> bình th</b>
<b>ườ</b>
<b>ng, Khố là ch</b>
<b>ữ</b>
</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>
Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 03 3.33
<b>5.2. Gi</b>
<b>ả</b>
<b>i thu</b>
<b>ậ</b>
<b>t tìm ki</b>
<b>ế</b>
<b>m</b>
*
Đố
i v
ớ
i m
ộ
t cây nh
ị
phân
để
tìm ki
ế
m xem m
ộ
t khố
x nào
đ
ó có trên cây
đ
ó khơng? Ta có th
ể
th
ự
c hi
ệ
n
nh
ư
sau:
So sánh x v
ớ
i khoá
ở
g
ố
c và m
ộ
t trong 4 tình hu
ố
ng
sau
đ
ây s
ẽ
xu
ấ
t hi
ệ
n:
1- Khơng có g
ố
c cây ( cây r
ỗ
ng): X khơng có trên cây,
</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>
<b>2- X trùng v</b>
<b>ớ</b>
<b>i khố </b>
<b>ở</b>
<b> g</b>
<b>ố</b>
<b>c: Phép tìm ki</b>
<b>ế</b>
<b>m </b>
<b>đượ</b>
<b>c </b>
<b>tho</b>
<b>ả</b>
<b> mãn.</b>
<b>3- X nh</b>
<b>ỏ</b>
<b> h</b>
<b>ơ</b>
<b>n khố </b>
<b>ở</b>
<b> g</b>
<b>ố</b>
<b>c: Tìm ki</b>
<b>ế</b>
<b>m </b>
<b>đượ</b>
<b>c th</b>
<b>ự</b>
<b>c hi</b>
<b>ệ</b>
<b>n </b>
<b>ti</b>
<b>ế</b>
<b>p t</b>
<b>ụ</b>
<b>c b</b>
<b>ằ</b>
<b>ng cách xét cây con trái c</b>
<b>ủ</b>
<b>a g</b>
<b>ố</b>
<b>c v</b>
<b>ớ</b>
<b>i cách </b>
<b>làm t</b>
<b>ươ</b>
<b>ng t</b>
<b>ự</b>
<b>.</b>
<b>4- X l</b>
<b>ớ</b>
<b>n h</b>
<b>ơ</b>
<b>n khoá </b>
<b>ở</b>
<b> g</b>
<b>ố</b>
<b>c: Tìm ki</b>
<b>ế</b>
<b>m </b>
<b>đượ</b>
<b>c th</b>
<b>ự</b>
<b>c hi</b>
<b>ệ</b>
<b>n </b>
<b>ti</b>
<b>ế</b>
<b>p t</b>
<b>ụ</b>
<b>c b</b>
<b>ằ</b>
<b>ng cách xét cây con ph</b>
<b>ả</b>
<b>i c</b>
<b>ủ</b>
<b>a g</b>
<b>ố</b>
<b>c v</b>
<b>ớ</b>
<b>i </b>
<b>cách làm t</b>
<b>ươ</b>
<b>ng t</b>
<b>ự</b>
<b>.</b>
<b>Ví d</b>
<b>ụ</b>
<b> Tìm x=28 trên cây a: So x và 35, x<35 nên ta </b>
<b>tìm trên cây con trái c</b>
<b>ủ</b>
<b>a 35</b>
</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19></div>
<!--links-->