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

Phan tich Thuat toan 6

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

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

Á

Á


Đ

ÁNH GIÁ M

T S



THU

T TOÁN THƠNG D

NG



Phạm Thế Bảo
Khoa Tốn – Tin học


Trường Đại học Khoa học Tự nhiên Tp.HCM


Tìm ki

ế

m tu

n t



• Xét một mảng các phần tử a[1], a[2], …, a[n]. Phần tử


a[i] có khóa tìm kiếm là a[i].key, bài tố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;


<b>ế</b>


;
else



i=i+1;
endif


<b>Nếu bỏelse:</b>


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=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

ế

u ta thêm m

t ph

n t

a[n+1].key=k thì s



phép tốn s

t

ă

ng hay gi

m?


phép tốn s

t

ă

ng hay gi

m?



Vi

ế

t l

i thu

t tố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 Bo



ã

Thu

t toỏn d

ng khi no?



i =n+1 ặkhụng tỡm thy


i=i<sub>0</sub>, vi 1i<sub>0</sub>n ặtỡm thy


ã

ỏnh giỏ ta c

ánh giá, ta c

n tính

n tính

α

α

:

:



–Tìm khơng thấy: k∉{a[i].key/i=1..n}Ỉ α=n, gọi q
là xác suất tìm khơng thấy.


–Tìm thấy sẽ có xác suất là (1-q)


–Đặt p<sub>i</sub>là xác suấtđểa[i].key bằng k


ế ế


–Giảthiết a[k].key khác a[l].key nếu k≠l


–Nếu a[i].key bằng k thì α=i-1???


–Vậy


Phạm Thế Bảo


1 1


(1 ) <i>n</i> <i><sub>i</sub></i> 1 và có <sub>trung bình</sub> <i>n</i> <i><sub>i</sub></i>( 1)


<i>i</i> <i>i</i>



<i>q</i> <i>q</i> <i>p</i> α α <i>p i</i>


= =


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

Khi tìm th

y s

l

ượ

ng so sánh khóa:



–Tối thiểu =


–Tốiđa =


–Trung bình =


1
n


1 <i>n</i> <i>pi</i>


α+ =∑


g


S

l

n so sánh khóa trung bình cho c

hai


tr

ườ

ng h

p tìm th

y và khơng tìm th

y là:



1
<i>i</i>=





1


(

1)

(1

)

<i>n</i> <i><sub>i</sub></i>


<i>i</i>


<i>n</i>

<i>q</i>

<i>q</i>

<i>ip</i>



=


+

+ −



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

1 2 2 3 3



k

đượ

c ch

n ng

u nhiê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à


i lần n lần


( 3)
2



<i>n n</i>+


2


( 3) 3


<i>n</i>
<i>q</i>


<i>n n</i> <i>n</i>


= <sub>+</sub> =


+


Xác su

t

để

k

{key} là


Suy ra



( 3) 3


2


<i>n n</i>+ <i>n</i>+


2
( 1) ( 1)


<i>i</i>


<i>i</i> <i>i</i>


<i>p</i>


<i>n n</i> <i>n n</i>


= <sub>+</sub> =


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

S

l

n so sánh khóa trung bình là:



2

2

2



(

1)

1



3

3

(

1)



<i>n</i>


<i>i</i>



<i>n</i>

<i>i</i>



=

+

+ −

<sub>⎜</sub>

<sub>⎟</sub>

<sub>⎜</sub>

<sub>⎟</sub>



+

<sub>⎝</sub>

+

<sub>⎠⎝</sub>

1

+

<sub>⎠</sub>



2


3

3

(

1)



2(

1)

1

2

(

1)(2

1)




.

.



3

3 (

1)

6



2

9

7



3(

3)



<i>i</i>


<i>n</i>

<i>n</i>

<i>n n</i>



<i>n</i>

<i>n</i>

<i>n n</i>

<i>n</i>



<i>n</i>

<i>n</i>

<i>n n</i>



<i>n</i>

<i>n</i>


=



+

<sub>⎝</sub>

+

<sub>⎠⎝</sub>

+

<sub>⎠</sub>


+

+

+

+


=

+


+

+

+


+

+


=


+




Phạm Thế Bảo



3(

<i>n</i>

+

3)



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>i</i>


<i>p</i> <i>i</i> <i>n</i>


<i>n</i>
= ∀ =
1 1

1

1


2


<i>n</i> <i>n</i>
<i>i</i>
<i>i</i> <i>i</i>

<i>n</i>


<i>ip</i>

<i>i</i>


<i>n</i>


+


=

=





3. Gi

s

có phân b

khóa nh

ư

sau:



1 1

2



<i>i</i>=

<i>n</i>

<i>i</i>=


1 2
3 2
1
2
...
2
...
2
<i>n</i> <i>n</i>
<i>c</i>
<i>p</i> <i>c</i> <i>p</i>


<i>c</i>
<i>p</i>
<i>c</i>
<i>p</i> −
= =
=
=


Phạm Thế Bảo


1



1 1


1
1


1 2 1


1 2 1


1


2 <sub>1</sub> 2


2
1
1
2 1
2
i


ta c o ù p


<i>n</i>
<i>n</i>
<i>n</i> <i>n</i>
<i>k</i>
<i>i</i> <i>k</i>
<i>n</i>


<i>c</i> <i>c</i> <i>c</i>



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

S

l

n so sánh khóa trung bình khi tìm th

y:



1 1


1 1 1


'
'
2 2
(1 )
n n
i-1 i


ùt f( ) i


<i>n</i> <i>n</i> <i>n</i>


<i>i</i> <i>i</i> <i>i</i>


<i>i</i> <i>i</i> <i>i</i>


<i>n</i>


<i>c</i> <i>i</i>


<i>ip</i> <i>i</i> <i>c</i>


<i>x</i> <i>x</i>
− −


= = =
= =
⎡ − ⎤
⎛ ⎞
⎢ ⎥
⎜ ⎟



1
2
( )
1
( 1) 1
(1 )


1
2


i 1 i


i=1 i=1


xet f(x)= ix x


với c được tính như trên


<i>n</i> <i>n</i>


<i>n</i>



<i>i</i>


<i>x</i>
<i>nx</i> <i>n</i> <i>x</i>


<i>x</i>
<i>ip</i> <i>cf</i>
+
=<sub>⎜</sub> <sub>⎟</sub> <sub>= ⎢</sub> <sub>⎥</sub>

⎝ ⎠ ⎣ ⎦
− + +
=

⎛ ⎞
⇒ = <sub>⎜ ⎟</sub>
⎝ ⎠




Phạm Thế Bảo


1
1
2
2
2
2
1
1


2


khi n đủ lớn (n


<i>i</i>
<i>i</i>
<i>n</i> <i><sub>n</sub></i>
<i>i</i>
<i>i</i>
<i>n</i>
<i>n</i>
<i>ip</i>
=
=
⎜ ⎟
⎝ ⎠
+

⇒ = ⇒ →



∞ ⇒) 2


N

ế

u thu

t tóan phân b

nh

ư

trên thì

độ

ph

c


t

p c

a thu

t toán là h

ng (nh

).



D

h

h

h

ê

đ



Do nh

ng ph

n t

th

ườ

ng xuyên

đượ

c g

p



nh

t

đượ

c s

p

ở đầ

u, nh

ng ph

n t

ử ở đầ

u có


xác su

t g

p cao h

ơ

n các ph

n t

càng v

sau,


t

l

này gi

m d

n r

t nhanh theo h

s

2.



Ví d

:

ng d

ng trong t

ch

c d

li

u c

a h

c

ơ



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

4. Xem xét m

t phân b

khác nh

ư

sau:



1 2


3


1 2


...
3


<i>c</i> <i>c</i>


<i>p</i> <i>p</i>


<i>c</i>
<i>p</i>


= =


=


1 1



...


1
1


1 1


1 ... ( ln )


2
i


n


ta c o ù p


m a ø H


<i>n</i>


<i>n</i> <i>n</i>


<i>n</i>


<i>i</i> <i>k</i>


<i>c</i>
<i>p</i>


<i>n</i>



<i>c</i> <i>c H</i>


<i>k</i>


<i>O</i> <i>n</i>


<i>n</i>


= =


=


= = =


= + + + =




Lúc

đ

ó s

phép so sánh khóa trung bình trong


tr

ườ

ng h

p tìm th

y là



Phạm Thế Bảo


2 <i>n</i>


1 1


1



ln


<i>n</i> <i>n</i>


<i>n</i>
<i>i</i>


<i>i</i> <i>i</i> <i>n</i>


<i>H</i> <i>n</i> <i>n</i>


<i>ip</i> <i>i</i>


<i>i</i> <i>H</i> <i>n</i>


= =


= = ≈




Tìm ki

ế

m nh

phân



Cho m

ng n ph

n t

th

a a[1].key<…<a[n].key



T

ng quát, ta s

xét t

a[l]

đế

n a[r], v

i l

r:



Tí h [(l+ )/2]


–Tính 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ếm lặp lại
cho bên phải, nghĩa là l=m+1


–Nếu a[m].key lớn hơn k, quá trình tìm kiếm lặp lại
cho bên trái, nghĩa là r=m-1


Thay vì tính nh

ư

trên, ta tính



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

Ví d

: xét n=6, m=(1+6)/2=3



–Nếu k∈{khóa} thì thuật tốn
dừng ởđâu?


Số lần lặp trung bình≈


[2,2]


[4,6]
3


5


6
4


2
1



[1,2]


[4,4] [6,6]


[1,6]


1 1 2 2 3 3 14



6

6



<i>x</i>

+

<i>x</i>

+

<i>x</i>

<sub>=</sub>



Phạm Thế Bảo


–Nếu k∉{khóa} thì thuật tốn
dừngở đâu?


Số lần lặ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
4


2
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


1 2 6 3

20



7

7



<i>x</i>

+

<i>x</i>



</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=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ận thấy: 1≤ α ≤log<sub>2</sub>n


• Ước lượng chính xác giá trịtrung bình của α:


Ta nhận thấy có thểbiểu diễn theo cây, vớiđịnh nghĩa quy nạ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được xây dựng vớiđọan
[l,m-1] và cây con phảiđược xây dựng vớiđọan [m+1,r].


Ví dụ: n=10


[3 4]


[6,10]
5


8
2


[1,4]


[6 7] [9,10]


[1 1]


Với mỗi cây T, ta xây dựng cây
mởrộng T<sub>1</sub>sao cho mỗi node
của t cóđúng hai con


Phạm Thế Bảo
[3,4]


9
6


3



[6,7] [9,10]


1
[1,1]


4 7 10


[4,4] <sub>[10,10]</sub>


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

Thu

t ng

:



–Node trong (node trịn) của T=node của T=n


–Node ngồi (vng) của T=node bổ sung=N


–Độộdàiđườnggđiđến node x: l(x)=s( ) ố cạạnh từggốc


đến x.


–Độdàiđườngđi trong cây T=


Trởlại ví dụtrên, độdài = 0x1+2x1+4x2+3x3=19
–Độdàiđườngđi trung bìnhđến mỗi node=


Trởlại ví dụ =19/10=1 9


{ trong}


l(x)=I(T)



<i>x</i>∈<i>node</i>



( )
số node trong


<i>I T</i>


( )


<i>l</i>




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 ngồi


<i>x</i>



<i>l x</i>




( )


số node ngồi


<i>E T</i>


M

nh

đề

:



a. Sốnode ngoài = sốnode trong +1, N=n+1
b. E(T)=I(T)+2n


c. Độộ dàiđườngg đi ngịai trung bình = g g <i>I T</i>( ) 2<sub>+1</sub>+ <i>n</i>


Ví d

trên, có E(T)=


I(T)=



E(T)=I(T)+2x10



n+1


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

Nh

n xét:



–Khi tìm thấy: dừng ở node trịn x
• β=1 vàα=l(x)+1


[

]



{ }


( ) 1


( )


d t ø


<i>l x</i>


<i>I T</i>


+





• Sốphép so sánh khóa TB=


–Khi khơng tìm thấy: dừngở node vng y
• β=0 vàα=l(y)


{ } ( )


1


node tron


<i>x</i> <i>I T</i>



<i>n</i> <i>n</i>


α <sub>=</sub> ∈ <sub>=</sub> <sub>+</sub>


( ) ( )


2 2 <i>I T</i> 1 1 <i>I T</i> 1


<i>n</i> <i>n</i>


α β− = ⎡<sub>⎢</sub> + − =⎤<sub>⎥</sub> +


⎣ ⎦




• Sốphép so sánh khóa TB=


Phạm Thế Bảo


( ) ( ) 2
1


<i>E T</i> <i>I T</i> <i>n</i>
<i>N</i> <i>n</i>


α = = +


+ <sub>( ) 4</sub>



2 2


1


<i>I T</i> <i>n</i>


<i>n</i>


α β<sub>− = ⎢</sub>⎡ + ⎤<sub>⎥</sub>
+


⎣ ⎦


S

p x

ế

p chèn



Có n ph

n t

a[1], …, a[n], ý t

ưở

ng:



–n=1 hiển nhiên a[1] được sắp


–Giả sử có k phần tử đầu a[1].key≤… ≤ a[k].key


được sắ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: 10 2 7 9 6 1 5
Lần 1 chèn 2 trước 10


Lần 2 chèn 7 giữa 2 và 10



</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

Thuật toán:
j=2;


while (j≤n) do
i=j-1;
k=a[j].key;[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ểu thức: (α<sub>j</sub>+1) so sánh sốhọc
và (α<sub>j</sub>+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: (α<sub>j</sub>+1) so sánh sốhọc vàα<sub>j</sub>so sánh khóa


–i khơng thểgiảm về0: (α<sub>j</sub>+1) so sánh sốhọc và (α<sub>j</sub>+1)so sánh
khóa


–Mục tiêu là xácđịnhα<sub>j</sub>:


• Nhận xét mảnh có cấu trúc nhưsau:
σ<sub>cur</sub>= <b>Khóa tăng</b> <b>aj</b>


• Gọiσ=a<sub>1</sub>a<sub>2</sub>… a<sub>n</sub>: hốn vịban đầu


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=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ế cuûa


<i>n</i>


<i>j</i>
<i>j</i>
<i>n</i>
<i>j</i>
<i>j</i>
α σ
α α σ
=
=
=
= ⇒ =


( )


1 (<i>n</i> 1) ⎡ <i>n</i> gán số hoc P(j)⎤ <i>n</i> 1


= + − +<sub>⎢</sub>∑ <sub>⎥</sub>+ +


a. Số phép gán sốhọc


b. So sánh số học


( )


2


2


1 ( 1) 1



2 1 2 1


gan so hoïc P(j)


min=0
n(n-1)
số nghich thế của max=


2
n(n-1)
4
<i>j</i>
<i>n</i>
<i>j</i>
<i>j</i>
<i>n</i> <i>n</i>


<i>n</i> α <i>n</i> σ


=
=
+ +<sub>⎢</sub> <sub>⎥</sub>+ +
⎣ ⎦




= − + = − + ⎨



⎪⎩


(

)


2


1 2 1 số nghịch thế của


<i>n</i>
<i>j</i>
<i>j</i>


<i>n</i> α <i>n</i> σ


= +∑ + = − +


c. Sao chép khóa = n-1


Phạm Thế Bảo
2


<i>j</i>=


d. Sao chép mẫu tin


e. So sánh khóa:


( )



2


2


( 1) 1


2 2 2 2


chép mẫu tin P(j)


số nghịch thế của


<i>n</i>
<i>j</i>
<i>n</i>
<i>j</i>
<i>j</i>
<i>n</i> <i>n</i>


<i>n</i> α <i>n</i> σ


=
=
⎡ ⎤
= − +<sub>⎢</sub> <sub>⎥</sub>+ −
⎣ ⎦
= − + = − +



<i>n</i>


• Khơng tốiưu


• Có tốiưu:


– a[j] là cực tiểu so với bên trái: i có thểgiảm về0


– Ngược lại i khơng giảm về0


(

)



2


1 1 số nghịch thế của


<i>n</i>
<i>j</i>
<i>j</i>
<i>n</i>
α σ
=
=

+ = − +
⎛ ⎞ ⎛ ⎞


Phạm Thế Bảo


(

)


2 2
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


=
<i>n</i> <i>n</i>
<i>j</i> <i>j</i>
<i>j</i> <i>j</i>
<i>n</i>
<i>j</i>


<i>a j</i> <i>a j</i>


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

V

y s

y

phép so sánh khóa là (s

p p

(

ngh

g

ch th

ế

c

a


σ

+(n- s

ph

n t

c

c ti

u bên trái))



(

1)



4

<i>n</i>


<i>n n</i>



<i>TB</i>

<i>n</i>

<i>H</i>




=

+ −



Phạm Thế Bảo


S

p x

ế

p ch

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 Ỉhốnđổi


–j=n-1 chj ọọn idx=9 Ỉhóanđổi


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

Thu

t toỏn:



j=n;


while (j2) do
idx=1;
i=2;


while (ij) do


if(a[i].key>a[idx].key) then
idx=i;



endif
i=i+1;
endw


a[j] ặa[idx];
j=j-1;


endw


Phm Th Bo


ã

o

o

n P(j) là tìm khóa l

n P(j) là tìm khóa l

n nh

n nh

t trong t

t trong t

p j ph

p j ph

n

n


t

.

Ướ

c l

ượ

ng t

ng chi phí trung bình c

a

α

<sub>j</sub>

nh

ư

sau:



(

1)



<i>n</i>


<i>j</i>


<i>p</i>

= +

<i>n</i>

<i>H</i>

<i>n</i>





Phạm Thế Bảo


1


(

1)




<i>j</i> <i>n</i>


<i>j</i>


<i>p</i>

<i>n</i>

<i>H</i>

<i>n</i>



=


+



</div>

<!--links-->

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×