28/03/2008
1
ÁÁ Ố
Đ
Á
NH GI
Á
MỘT S
Ố
THUẬT TOÁN THÔNG DỤNG
Phạm Thế Bảo
Khoa Toán – Tin học
Trường Đại học Khoa học Tự nhiên Tp.HCM
Tìm kiếmtuầntự
• Xét mộtmảng các phầntử a[1], a[2], …, a[n]. Phầntử
a[i] có khóa tìm kiếm là a[i].key, bài toán: cho trước
khóa
k,
có
tồn
tại
j
để
a[j]
.
key
bằng
k
hay
không
?
khóa
k,
có
tồn
tại
j
để
a[j]
.
key
bằng
k
hay
không
?
i=1;
found=false;
while((i≤n)&&(not found)) do
if(a[i].key bằng k) then
found=true
;
ế
;
else
i=i+1;
endif
endw
Phạm Thế Bảo
N
ế
ubỏ else:
1. Thuật toán còn đúng không?
2. Có tăng phép đếm (gán)?
28/03/2008
2
• Ta cần phân biệt:
Phép toán số học: so sánh, gán
Phép toán trên khóa: sao chép, so sánh
• Nếutathêmmộtphầntử a[n+1].key=k thì số
phép
toán
sẽ
tăng
hay
giảm
?
phép
toán
sẽ
tăng
hay
giảm
?
• Viếtlạithuật toán:
i=1;
a[n+1].key=k;
while (a[
i
].key
khác
k) do
while
(a[
i
].key
khác
k)
do
i= i+1;
endw
Phạm Thế Bảo
• Thuậttoándừng khi nào?
– i =n+1 Æ không tìm thấy
– i=i
0
, với1≤i
0
≤n Æ tìm thấy
•
Để
đánh
giá
ta
cần
tính
α
:
Để
đánh
giá
,
ta
cần
tính
α
:
– Tìm không thấy: k∉{a[i].key/i=1 n}Æ α=n, gọiq
là xác suất tìm không thấy.
– Tìm thấysẽ có xác suất là (1-q)
– Đặtp
i
là xác suất để a[i].key bằng k
ế
ế
–
Giả thi
ết
a[k].key khác a[l].key n
ế
uk
≠
l
– Nếua[i].keybằng k thì α=i-1 ???
– Vậy
Phạm Thế Bảo
11
(1 ) 1 ( 1)
trung bình
vaø coù
nn
ii
ii
qqp pi
αα
==
+− = == −
∑∑
28/03/2008
3
• Khi tìm thấysố lượng so sánh khóa:
– Tốithiểu=
– Tối đa=
–
Trun
g
b
ình =
1
n
1
n
i
p
α
+=
∑
g
• Số lầnsosánhkhóatrungbìnhchocả hai
trường hợp tìm thấy và không tìm thấylà:
1i=
∑
1
(1)(1)
n
i
i
nq qip
=
++−
∑
Phạm Thế Bảo
Xem xét phân bố khóa
1. Giả sử a[i].key=i
k
đ
h
ẫ
hiê
từ
tậ
h
12233
k
đ
ượcc
h
ọnng
ẫ
un
hiê
n
từ
tậ
p
h
ợp
1
,
2
,
2
,
3
,
3
,
3, …, i, i, …, i, …, n, …, n, n+1, n+2, …, 2n
Tổng số khả năng có thể là:(1+2+…+n)+n=
Æ
Xác
suất
để
k
∉
{key}
là
ilầnnlần
(3)
2
nn+
2
(3)
3
n
q
nn
n
==
+
+
Æ
Xác
suất
để
k
∉
{key}
là
Suy ra
Phạm Thế Bảo
(3)
3
2
nn
n
+
+
2
(1)
(1)
2
i
ii
p
nn
nn
==
+
+
28/03/2008
4
Æ Số lần so sánh khóa trung bình là:
22 2
(1) 1
33(1)
n
i
ni
⎛⎞
⎛⎞
=+ +−
⎜⎟
⎜⎟
++ +
⎝⎠
⎝⎠
∑
1
2
33(1)
2( 1) 1 2 ( 1)(2 1)
33(1) 6
297
3( 3)
i
nnnn
nn nnn
nnnn
nn
=
⎜⎟
⎜⎟
++ +
⎝⎠
⎝⎠
++ ++
=+
+++
++
=
+
∑
Phạm Thế Bảo
3( 3)
n
+
2. Giả sử dữ liệu phân bốđều Æ
– Số lần so sánh khóa trung bình khi tìm thấy:
1
,1
i
p
in
n
=∀=
11
11
2
nn
i
ii
n
ip i
n
+
==
∑∑
3. Giả sử có phân bố khóa như sau:
11
2
ii
n
==
12
3
2
1
2
2
2
n
n
c
pc p
c
p
c
p
−
==
=
=
Phạm Thế Bảo
1
11
1
1
11
2
121
1
22
1
2
1
1
21
2
i
ta coù p
n
n
nn
k
ik
n
cc c
c
−
==
⎛⎞
−
⎜⎟
⎡
⎤
⎛⎞
⎝⎠
== = = −
⎢
⎥
⎜⎟
⎝⎠
⎢
⎥
⎣
⎦
−
⇒=
⎡⎤
⎛⎞
−
⎢⎥
⎜⎟
⎝⎠
⎢⎥
⎣⎦
∑∑
28/03/2008
5
S ln so sỏnh khúa trung bỡnh khi tỡm thy:
11
11 1
'
'
22
(
1
)
nn
i
-
1i
ự
tf( ) i
nn n
i
ii
ii i
n
ci
ip i c
x
x
== =
==
1
2
()
1
(1) 1
(1 )
1
2
i1 i
i=1 i=1
xe
t
f(
x
)
=
i
xx
vụựi c ủửụùc tớnh nhử treõn
nn
n
i
x
nx n x
x
ip cf
+
=
=
+ +
=
=
Phm Th Bo
1
1
2
2
2
2
1
1
2
khi n ủuỷ lụựn (n
i
i
n
n
i
i
n
n
ip
=
=
+
=
)2
Nuthut túan phõn b nh trờn thỡ phc
tpcathuttoỏnlhng (nh).
D
h
h
h
ờ
D
on
h
ng p
h
nt
t
h
ng xuy
ờ
n
cg
p
nht csp u, nhng phntucú
xỏc sutgpcaohncỏcphnt cng v sau,
t l ny gimdnrt nhanh theo h s 2.
Vớ d: ng dng trong t chcd liucah c
s d liu Oracle
Phm Th Bo
28/03/2008
6
4. Xem xét một phân bố khác như sau:
12
3
12
3
cc
pp
c
p
==
=
11
1
1
11
1 (ln)
2
i
n
ta coù p
maø H
n
nn
n
ik
c
p
n
ccH
k
On
n
==
=
== =
=+ + + =
∑∑
• Lúc đósố phép so sánh khóa trung bình trong
trường hợp tìm thấylà
Phạm Thế Bảo
2
n
11
1
ln
nn
n
i
ii
n
H
nn
ip i
iH n
==
==≈
∑∑
Tìm kiếmnhị phân
• Cho mảng n phầntử thỏa a[1].key<…<a[n].key
• Tổng quát, ta sẽ xét từ a[l] đến a[r], vớil≤r:
Tí h
[(
l+
)/2]
–
Tí
n
h
m=
[(
l+r
)/2]
– Nếu a[m].key bằng k Æ dừng
– Nếu a[m].key nhỏ hơn k, quá trình tìm kiếmlặplại
cho bên phải, nghĩa là l=m+1
– Nếu a[m].key lớnhơn k, quá trình tìm kiếmlặplại
cho
b
ên trái, nghĩalàr=
m
-1
• Thay vì tính như trên, ta tính
m=(a[l].key+a[r].key)/2 Æ chuyệngì?
Phạm Thế Bảo
28/03/2008
7
• Ví dụ: xét n=6, m=(1+6)/2=3
– Nếuk∈{khóa} thì thuậttoán
dừng ở đâu?
Số lầnlặp trung bình ≈
[2,2]
[4,6]
3
5
6
42
1
[1,2]
[4,4]
[6,6]
[1,6]
11 2 2 33 14
66
xxx++
=
Phạm Thế Bảo
– Nếuk∉ {khóa} thì thuậttoán
dừng ở đâu?
Số lầnlặp trung bình ≈
a∈(-∞,a[1].key)
b
∈
(a[1].
key,a
[2].key
)
c
∈
(a[2].
key,a
[3].key)
[2,2]
[4,6]
3
5
6
42
1
a
[1,2]
[4,4]
[6,6]
[1,6]
b
∈
(a[1].
key,a
[2].key
)
c
∈
(a[2].
key,a
[3].key)
d∈(a[3].key,a[4].key) e∈(a[4].key,a[5].key)
f∈(a[5].key,a[6].key) g∈(a[5].key,+ ∞)
b c d e
f g
12 63 20
77
xx
+
=
Phạm Thế Bảo
28/03/2008
8
Thuật toán:
l=1;
r=n;
idx=-1;
while (l≤r) do
m=[l+r]/2;
if(a[m].key==k) then
idx=m;
l=r+1;
else
if(if(a[m].key<k) then
l=m+1;
else
r=m-1;
endif
endif
endw
Phạm Thế Bảo
• β=1 khi k∈{khóa} và β=0 khi k∉{khóa}
• Có 2α-β so sánh khóa
• Ta nhậnthấy: 1≤α≤log
2
n
• Ướclượng chính xác giá trị trung bình của α:
Ta nhậnthấycóthể biểudiễn theo cây, với định nghĩaquynạp cho cây: với
đoạn [l,r] cây có gốc là m=[(l+r)/2] và cây con trái đượcxâydựng với đọan
[l,m-1] và cây con phải đượcxâydựng với đọan [m+1,r].
Ví dụ:n=10
[3 4]
[6,10]
5
82
[1,4]
[6 7]
[9,10]
[1 1]
Vớimỗi cây T, ta xây dựng cây
mở rộng T
1
sao cho mỗi node
củatcóđúng hai con
Phạm Thế Bảo
[3
,
4]
9
63
[6
,
7]
[9,10]
1
[1
,
1]
4 7
10
[4,4]
[10,10]
[7,7]
28/03/2008
9
• Thuậtngữ:
– Node trong (node tròn) của T=node củaT=n
– Node ngoài (vuông) của T=node bổ sung=N
–
Đ
ộ
dài đườn
g
đi đến node x: l
(
x
)
=số c
ạ
nh từ
g
ốc
ộ
g
()
ạ
g
đếnx.
– Độ dài đường đi trong cây T=
Trở lạivídụ trên, độ dài = 0x1+2x1+4x2+3x3=19
– Độ dài đường đi trung bình đếnmỗi node=
Trở
lại
ví
dụ
=
19/10
=
19
{} trong
l(x)=I(T)
xnode∈
∑
()
soá node trong
IT
()
l
∑
Trở
lại
ví
dụ
,
19/10 1
.
9
– Độ dài đường đi ngòai = E(T) =
– Độ dài đường đi ngòai trung bình =
Phạm Thế Bảo
{}
()
node ngoaøix
l
x
∈
∑
()
soá node ngoaøi
ET
• Mệnh đề:
a. Số node ngoài = số node trong +1, N=n+1
b. E(T)=I(T)+2n
c. Đ
ộ
dài đườn
g
đin
g
òai trun
g
b
ình =
() 2
+1
I
Tn
+
ộ
g
g
g
Ví dụ trên, có E(T)=
I(T)=
E(T)
=
I(T)+2x10
n
+1
E(T) I(T)+2x10
Phạm Thế Bảo
28/03/2008
10
• Nhậnxét:
– Khi tìm thấy: dừng ở node tròn x
• β=1 và α=l(x)+1
[
]
{}
() 1
()
dt
ø
lx
IT
+
∑
•
• Số phép so sánh khóa TB=
– Khi không tìm thấy: dừng ở node vuông y
• β=0 và α=l(y)
{}
()
1
no
d
e
t
ron
x
IT
nn
α
∈
==+
() ()
2211 1
IT IT
nn
αβ
⎡⎤
−
=+−=+
⎢⎥
⎣⎦
•
• Số phép so sánh khóa TB=
Phạm Thế Bảo
() () 2
1
E
TIT n
Nn
α
+
==
+
() 4
22
1
I
Tn
n
αβ
+
⎡
⎤
−=
⎢
⎥
+
⎣
⎦
Sắpxếpchèn
• Có n phầntử a[1], …, a[n], ý tưởng:
– n=1 hiển nhiên a[1] đượcsắp
– Giả sử cókphầntửđầu a[1].key≤… ≤ a[k].key
đượcsắp, ta phải tìm cách chèn a[k+1] vào đúng vị
trí.
Ví dụ:n=7,cómảng:10279615
Lần1chèn2trước10
Lần2chèn7giữa 2 và 10
…
Phạm Thế Bảo
28/03/2008
11
Thuật toán:
j=2;
while (j≤n) do
i=j-1;
k=a
[j]
.ke
y
;
[j] y
r=a[j];
while ((i>0)&&(k<a[i].key)) do
a[i+1]=a[i];
i=i-1;
endw
a[i+1]=r;
a[i+1]=r;
j=j+1;
endw
Phạm Thế Bảo
• Xét P(j) có hai trường hợp:
– Không tối ưu hóa biểuthức: (α
j
+1) so sánh số học
và (α
j
+1) so sánh khóa.
– Tối ưu:
i
có
thể
giảm
về
0:
(
α
+1)
so
sánh
số
học
và
α
so
sánh
khóa
–
i
có
thể
giảm
về
0:
(
α
j
+1)
so
sánh
số
học
và
α
j
so
sánh
khóa
– i không thể giảmvề 0: (α
j
+1) so sánh số họcvà(α
j
+1)so sánh
khóa
– Mục tiêu là xác định α
j
:
• Nhậnxétmảnh có cấutrúcnhư sau:
σ
cur
=
Khóa tăng a
j
• Gọi σ=a
1
a
2
… a
n
: hoán vị ban đầu
• α
j
= số phầntử bên trái a
j
trong σ
cur
mà lớnhơna
j
=số phầntử bên trái a
j
trong σ mà lớnhơna
j
Phạm Thế Bảo
28/03/2008
12
• Vậy
a
Số
phép
gán
số
học
1
2
0
1
số nghòch thế của
có số nghòch thế của
n
j
j
n
j
j
ασ
α
ασ
=
=
=
=⇒ =
∑
∑
(
)
1( 1) 1
ga
ù
nso
á
hoc P(j)
n
nn
⎡⎤
=+
−
+++
⎢⎥
∑
a
.
Số
phép
gán
số
học
b. So sánh số học
(
)
2
2
1( 1) 1
21 21
gan
so
ho
ï
c
P(j)
min=0
n(n-1)
số nghich thế của max=
2
n(n-1)
4
j
n
j
j
nn
nn
ασ
=
=
++ ++
⎢⎥
⎣⎦
⎧
⎪
⎪
⎪
=−+ =−+
⎨
⎪
⎪
⎪
⎩
∑
∑
()
2
121số nghòch thế của
n
j
j
nn
α
σ
=+ + = −+
∑
c. Sao chép khóa = n-1
Phạm Thế Bảo
2
j
=
d. Sao chép mẫu tin
e. So sánh khóa:
()
2
2
(1) 1
22 22
chép mẫu tin P(j)
số nghòch thế của
n
j
n
j
j
nn
nn
α
σ
=
=
⎡⎤
=−+ +−
⎢⎥
⎣⎦
=−+ =−+
∑
∑
n
• Khơng tối ưu
• Có tối ưu:
– a[j] là cựctiểuso với bên trái: i có thể giảmvề 0
– Ngượclại i khơng giảmvề 0
(
)
2
11số nghòch thế của
n
j
j
n
α
σ
=
=+=−+
∑
⎛⎞⎛⎞
Phạm Thế Bảo
(
)
22
2
1
,
[] []
1
n
j
j=2
a[1] là loại 1, loại 1 và 2 bù nhau
loại 1 loại 2
=
nn
jj
jj
n
j
aj aj
αα
α
==
=
⎛⎞⎛⎞
+
⎜⎟⎜⎟
=+
⎜⎟⎜⎟
⎜⎟⎜⎟
⎝⎠⎝⎠
+
∑∑
∑∑
28/03/2008
13
V
ậy
số
p
hé
p
so sánh khóa là
(
số n
g
h
ị
ch thế của
ậy
pp
(
g ị
σ +(n- số phầntử cựctiểu bên trái))
(1)
4
n
nn
TB n H
−
⇒= +−
Phạm Thế Bảo
Sắpxếpchọn
• Ý tưởng: xét j=n, …, 2 chọn max trong
{a[1] key a[2] key a[j] key}
tại
idx
đổi
{a[1]
.
key
,
a[2]
.
key
, …,
a[j]
.
key}
tại
idx
,
đổi
chỗ a[j] và a[idx].
ví dụ: 10 2 7 9 6 1 5
– j=n chọn idx=1 Æ hoán đổi
–
j
=n-1 ch
ọ
n idx=9 Æ hóan đổi
j
ọ
– …
Phạm Thế Bảo
28/03/2008
14
Thuật toán:
j=n;
while (j≥2) do
idx=1;
i=2;
while (i≤j) do
if(a[i].key>a[idx].key) then
idx=i;
endif
i=i+1;
endw
a[j] ÅÆ a[idx];
j=j-1;
endw
Phạm Thế Bảo
•
Đoạn
P(j)
là
tìm
khóa
lớn
nhất
trong
tập
j
phần
Đoạn
P(j)
là
tìm
khóa
lớn
nhất
trong
tập
j
phần
tử. Ướclượng tổng chi phí trung bình của α
j
như sau:
(1)
n
j
pnHn
=+
−
∑
Phạm Thế Bảo
1
(1)
j
n
j
pnHn
=
+
∑