Tải bản đầy đủ (.pdf) (14 trang)

Đánh giá một số thuật toán thông dụng

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 (228.52 KB, 14 trang )

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,

tồn
tại
j
để
a[j]
.
key
bằng
k
hay
không


?
khóa
k,

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}


ilầnnlần
(3)
2
nn+
2
(3)
3
n
q
nn
n
==
+
+
Æ
Xác
suất
để
k

{key}


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]


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

dụ
=
19/10
=
19

{} trong
l(x)=I(T)
xnode∈

()
soá node trong
IT
()
l

Trở
lại

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

thể
giảm
về

0:
(
α
+1)
so
sánh
số
học

α
so
sánh
khóa

i

thể
giảm
về
0:

(
α
j
+1)

so

sánh
số

học

α
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

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)

tìm
khóa
lớn
nhất
trong
tập
j
phần

Đoạn
P(j)

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
=
+


×