45
 CHƯƠNG 2: PHÂN TÍCH THUT TOÁN SP XP ...................................................... 1 1. Ví dmđầu ................................................................................................................ 1 < 4 – 18 chưa có bài gõ> .............................................................................................. 3 2. Snghch thế ca mt phép hoán v(còn thiếu trang 8 trong tài liu photo) .............. 3 3. Hai thut toán sp xếp đơn gin( còn thiếu trang 16 trong tài liu photo) ................... 3 < 4 – 18 chưa có bài gõ> .............................................................................................. 3 4. Thut toán sp xếp nhanh (QuickSort) ........................................................................ 4 4.1 Thut toán Q: ......................................................................................................... 5 4.2 Phân tích Thut toán Q .......................................................................................... 6 4.3 Thut toán Mergesort (MS) và Heapsort (HS) .................................................... 10 4.4 Phân tich thut toán M: ........................................................................................ 11 4.5 Thut toán H (Heapsort) ...................................................................................... 14 4.6 Phân tích thut toán H: ......................................................................................... 15 Bài tp: ........................................................................................................................... 15 Chương 3: Phân tích thut toán tìm kiếm .......................................................................... 19 < 1- 12 chưa có bài gõ> ............................................................................................. 19 1. Cây nhphân .............................................................................................................. 19 < 1- 12 chưa có bài gõ> ............................................................................................. 20 2. Tìm kiếm tun t........................................................................................................ 20 2.1 Phân tích............................................................................................................... 20 2.2 Thuâ t toán S......................................................................................................... 20 2.3 Phân tích thut toán S.......................................................................................... 20 2.4 Phân tích............................................................................................................... 23 3. Tìm kiếm trên bng có tht..................................................................................... 24 <17-19 chưa có bài> .................................................................................................. 24 4. Tìm kiếm trên cây nhphân ....................................................................................... 27 4.1 Thut toán B......................................................................................................... 27 4.2 Sp xếp bng cách chèn vào cây nhphân ........................................................... 31 4.3 Hy (delete) mt nút khi cây nhphân: ............................................................. 31 4.4 Tn struy cp: .................................................................................................... 33 4.5 Cây cân bng: ....................................................................................................... 33 5. Kthut Hash ............................................................................................................ 36 5.1 Sdng trc tiếp địa ch...................................................................................... 36 5.2 Hàm Hash ............................................................................................................. 37 5.3 Gii quyết va chm bng danh sách liên kết:....................................................... 39 <47-48 chưa có bài gõ> ............................................................................................. 40 5.4 Bng các phn tri rác ni kết: ........................................................................ 40 5.5 Phương pháp ghi địa chm................................................................................ 44 CHƯƠNG 2: PHÂN TÍCH THUT TOÁN SP XP 1. Ví dmđầu Ta bt đầu bng vic phân tích mt thut toán đơn gin là tìm phn tln nht ca mt dãy. - 1 -

Chapter 2 3

Embed Size (px)

Citation preview

Page 1: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 1/45

 

CHƯƠNG 2: PHÂN TÍCH THUẬT TOÁN SẮP XẾP ...................................................... 11. Ví dụ mở đầu ................................................................................................................1

< 4 – 18 chưa có bài gõ> ..............................................................................................32. Số nghịch thế của một phép hoán vị (còn thiếu trang 8 trong tài liệu photo) ..............33. Hai thuật toán sắp xếp đơn giản( còn thiếu trang 16 trong tài liệu photo) ...................3

< 4 – 18 chưa có bài gõ> ..............................................................................................34. Thuật toán sắp xếp nhanh (QuickSort) ........................................................................ 44.1 Thuật toán Q: ......................................................................................................... 54.2 Phân tích Thuật toán Q .......................................................................................... 64.3 Thuật toán Mergesort (MS) và Heapsort (HS) .................................................... 104.4 Phân tich thuật toán M: ........................................................................................114.5 Thuật toán H (Heapsort) ......................................................................................144.6 Phân tích thuật toán H: .........................................................................................15

Bài tập: ...........................................................................................................................15Chương 3: Phân tích thuật toán tìm kiếm .......................................................................... 19

< 1- 12 chưa có bài gõ> .............................................................................................19

1. Cây nhị phân .............................................................................................................. 19< 1- 12 chưa có bài gõ> .............................................................................................202. Tìm kiếm tuần tự........................................................................................................ 20

2.1 Phân tích ...............................................................................................................202.2 Thuât toán S ......................................................................................................... 202.3 Phân tích thuật toán S .......................................................................................... 202.4 Phân tích ...............................................................................................................23

3. Tìm kiếm trên bảng có thứ tự .....................................................................................24<17-19 chưa có bài> ..................................................................................................24

4. Tìm kiếm trên cây nhị phân .......................................................................................274.1 Thuật toán B .........................................................................................................27

4.2 Sắp xếp bằng cách chèn vào cây nhị phân ........................................................... 314.3 Hủy (delete) một nút khỏi cây nhị phân: ............................................................. 314.4 Tần số truy cập: ....................................................................................................334.5 Cây cân bằng: .......................................................................................................33

5. Kỹ thuật Hash ............................................................................................................ 365.1 Sử dụng trực tiếp địa chỉ ......................................................................................365.2 Hàm Hash .............................................................................................................375.3 Giải quyết va chạm bằng danh sách liên kết: .......................................................39<47-48 chưa có bài gõ> .............................................................................................405.4 Bảng các phần tử rải rác nối kết: ........................................................................ 405.5 Phương pháp ghi địa chỉ mở ................................................................................44

CHƯƠNG 2: PHÂN TÍCH THUẬT TOÁN SẮP XẾP

1. Ví dụ mở đầuTa bắt đầu bằng việc phân tích một thuật toán đơn giản là tìm phần tử lớn

nhất của một dãy.

- 1 -

Page 2: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 2/45

 

Giả sử có N số hay N chuỗi ký tự lưu trong một mảng X[1], X[2],…, X[N].Hãy tìm m và j sao cho:

m = X[j] = max {X[k]; 1≤k≤N}

Để trình bày thuật toán tìm max (Thuật toán M), cũng như các thuật toán

sau này, ta sẽ dùng mã giả “Tựa Pascal” trong đó có một thay đổi nhỏ dựa theo phần mềm Computer Algebra MAPLE của Đại học Waterloo, Canada: Các vònglặp For…do, While…do sẽ được chấm dứt bởi từ khóa od; các lệnh if … then hayif … then …else sẽ được chấm dứt bởi từ khóa fi thay vì được mở - đóng bởi cặptừ khóa Begin – End.

Trong thuật toán M, ngoài mảng X[1], X[2],…, X[N] ta cũng sử dụng 2 biến phụ m, j để chỉ giá trị MAX của mảng, và chỉ số của phần tử trong mảng cógiá trị MAX.

Thuật toán được viết như sau:

Thuật toán M:

BEGIN

 j:=1; m:=X[1];

FOR i:=2 to N do

if X[i]>m then

m:=X[i];

 j:=i;

fiod

END

Có thể chứng minh bằng nguyên lý qui nạp rằng Thuật toán M thực sự lưugiá trị MAX và chỉ sổ tương ứng trong hai biến m,j sau khi ra khỏi thuật toán.

 Nếu gọi α là thời gian thực hiện một phép so sánh và β là thời gian thựchiện một phép gán thì thời gian thực hiện thuật toán M là:

T= 2 β + (N-1) α + 2 A N β

Trong đó A N là số lần mà điều kiện X[i]>m được thỏa trong vòng lặp FOR.Thật ra khi tính T, ta đã bỏ qua thời gian quản lý vòng lặp FOR 

(bookeeping) gồm N phép so sánh biến nguyên và N-1 phép tăng biến nguyên mộtđơn vị, thì thời gian này khá bé so với thời gian so sánh 2 phần tử của mảng hoặcthời gian gán một phần tử của mảng vào một biến.

- 2 -

Page 3: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 3/45

 

<Trang 3 không có trong sấp photo>

< 4 – 18 chưa có bài gõ>

2. Số nghịch thế của một phép hoán vị (còn thiếu trang 8 trong tài liệu photo)

3. Hai thuật toán sắp xếp đơn giản( còn thiếu trang 16 trong tài liệu photo)

< 4 – 18 chưa có bài gõ>

Phân tích: Ở ngoài vòng lặp while ta thực hiện 4(N-1) phép gán (thực chất là 3(N-1) vì phép gán i:=j-1 là bookeeping).Trong vòng lặp while ta thực hiên A phép gán mẩu tin và A phép gán biến nguyên(Bookeeping) trong đó A chính là số cặp khoá không đúng chỗ, nghĩa là số nghịchthế của phép hoán vị π sao cho

K[π(1) ] < K[π(2) ] < … < K[π(n) ]khi chưa sắp xếpSố phép so sánh trong vòng lặp while la A + (N-1) phép so sánh khoá và A + (N-1) + B phép so sánh i > 0 (bookeeping)Ở đây B là số lần mà chỉ số i giảm đến 0 nghĩa là khi K[j] = min{K[i]; 1≤i≤j}. Đạilượng A có giá trị cực tiểu là 0 khi mảng ban đầu đã được sắp xếp và giá trị cực

đại là2

)1( − N  N  khi mảng ban đầu được xếp theo thứ tự ngược. Theo định nghĩa

2.3, giá trị trung bình của A la4

)1( − N  N với độ lệch )

2

5)(1(

6

1+− nnn .

Cuối cùng đại lượng B có thể được tính toán tương tự như trong thuật toán tìmMAX với giá trị cực tiểu là 0, cực đại là N – 1 và giá trị trung bình là H N – 1 vớiđộ lệch )2(

 N  N  H  H  − . Tóm lại thuật toán S chạy nhanh nhất với độ phức tạp O(N)khi mảng đã có thứ tự. Trường hợp xấu nhất và trung bình độ phức tạp là O(N 2).Số phép so sánh khoá trung bình của thuật toán S chỉ còn bằng một nửa số phép sosánh khoá trung bình của thuật toán C. Tuy nhiên, số phép gán đã tăng cao hơntrước.Ví dụ 1: Ta sử dụng thuật toán S để sắp xếp mảng 503 087 512 061 908 170 897275 653 426 154 509 612 677 765 703. Kết quả được cho trong bảng dưới đây:

x503:087087 503x:512

x087 503 512:061061 087 503 512x:908

- 3 -

Page 4: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 4/45

 

061 087x 503 512 908:170061 087 170 503 512x 908:897…..061 087 154 170 275 426 503 509 512 612 653 677x 765 897 908:703061 087 156 170 275 426 503 509 512 612 653 677 703 765 897 908

Ở đây N = 16, A = 41, B = 2

4. Thuật toán sắp xếp nhanh (QuickSort)Sự cải tiến của thuật toán S so với thuật toán C không lớn lắm do ở mỗi bước lặp,số nghịch thế chỉ giảm được một đơn vị. Do đó độ phức tạp có cùng cỡ với sốnghịch thế của phép toán hoán vị cấp N mà giá trị trung bình đã được chứng minhlà O(N2).Để cải tiến hơn, ở mỗi bước càn làm giảm số nghịch thế càng nhiều càng tốt. GọiK là giá trị khoá ở giữa, ta sẽ tìm cách chia mảng M ban đầu thành 2 mảng con

M1, M2, trong đó M1 là mảng con bên trái gồm các mẫu tin có khoá ≤ K và M2 làmảng con bên phải gồm các mẩu tin có khoá > K. Phép chia này cần N phép sosánh và tối đa N phép dời chỗ. Sau khi chia, một cặp (K[i], K[j]), i < j, chỉ có thểlà một nghịch thế nếu 2 mẫu tin tương ứng cùng thuộc M1 hay cùng thuộc M2. Như

thế số nghịch thế tối đa có thể có sẽ được giảm từ2

)1( − N  N xuống còn:

4

)2()1

2(

22

12

−=−

N  N  N  N  x x

nghĩa là đã giảm được hơn một nữa. Ở bước tiếp theo, hai mảng con M1, M2 lạitiếp tục được chia đôi và số nghịch thế tối đa có thể có lại được giảm hơn một nữa.

 Như thế chỉ cần tối đa  N  N  N  22 log2)2

)1((log ≈− bước, mảng sẽ không chứa

nghịch thế. Nói cách khác mảng đã được sắp thứ tự. Số phép so sánh tối đa sẽ là N  N  2log2 và số phép dời chỗ còn ít hơn nữa.

Rất tiếc là ta không biết giá trị khóa K ở giữa. Ta chỉ có thể chọn ngẫu nhiênmột khóa trong mảng, giá trị K[1] chẳng hạn để làm phần tử cầm canh trong phép

 phân chia. May mắn thay ta sẽ chứng minh rằng cách chọn ngẫu nhiên này cũngcho kết quả không tồi trong trường hợp trung bình.

Đến đây có một số khó khăn kỹ thuật xuất hiện. Ta muốn sắp xếp tại chỗ màkhông cần một bộ nhớ phụ có chiều dài N để dời các mẫu tin đến nửa con bên tráivà bên phải. Có nhiều cách để giải quyết khó khăn này. Ta sẽ chọn cách “đốt nếntừ hai đầu” của R. Sedgewide. Ta tiến lên từ bên trái của mảng M cho đến khi gặpmột mẩu tin có khóa lớn hơn R. Đồng thời ta lùi lại từ bên phải của mảng cho đếnkhi gặp một khóa ≤ R. Đổi chỗ hai mẫu tin trên tiếp tục đốt hai đầu từ chỗ đãdùng cho đến khi nến đã cháy hết thì phép phân chia dừng: ta được mảng con bêntrái M1 và mảng con bên phải M2. Tiếp tục phân chia M1 và M2 bằng cách đốt hai

- 4 -

Page 5: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 5/45

 

đầu cho đến khi các mảng con thu được chỉ còn một phần tử thì dừng. Lúc nàymảng đã được sắp thứ tự tăng theo khóa.

Khó khăn thứ hai là ở mỗi một lúc ta chỉ có thể xử lý một mảng con. Các mảngcon còn lại sẽ được cất trong một stack để chờ xử lý.

Trong trường hợp xấu nhất, ở mỗi bước một trong hai mảng con sau khi chia chỉcó hai phần tử. Như vậy cần phải sử dụng một stack có cổ O(N). Điều này giảithích tại sao thuật toán sẽ ngưng chạy vì stack overflow trong trường hợp xấu nếuchương trình được viết theo cách …. Ta giải quyết khó khăn này bằng cách lưu mãcon dài hơn vào stack trước, mảng … được … vào sau và do đó sẽ được xử lýtrước (qui tắc…). Bằng cách này ta chỉ cần một stack có chiều dài log2 N là đủ.

Trên đây là ý tưởng chính của thuật toán … (Quicksort) của C.A.R.Hoare.

Để trình bày thuật toán Q, ta sẽ sử dụng một stack có chiều dài log 2 N mà mỗi phần tử của … là một cặp (l,r) để trỏ tới phần tử đầu tiên và phần tử cuối cùng của

mảng con tương ứng. Ngoài ra để giảm bớt bookeeping, ta … thêm một mẩu tingiả R[N+1] có khóa là +∞ (lớn hơn mọi giá trị khóa trong mảng). Để đơn giảnhóa thuật toán, ngoài hai thủ tục Push và Pop có sẵn của stack ta cũng đưa vào thủtục giả cho hoán vị hai phần tử trong mảng, cũng như các … chiều dài và so sánhđể trả về chiều dài r hay so sánh chiều dài hai mảng. Hàm so sánh trả về một cặpgiá trị: giá trị đầu là các con trỏ chỉ đến mảng dài hơn và giá trị sau là các con trỏchỉ đến mảng ngắn hơn trong … mảng đem so sánh.

4.1 Thuật toán Q:

Begin

Push (1,N) vào stack;While stack <> φ do

(l,r):= Pop stack;

i:=l+1; j:=r;

K:=K[r]; R:=R[l];

Repeat

While K[i] ≤ K do i:=i+1 od

While K[i] > K do j:=j-1 odIf j ≤ i then hoán vị R[l] và R[j]

Else hoán vị R[i] và R[j]

f i

until j ≤ i

(M1, M2):= so sánh ((l,j-1),(j+1,r))

- 5 -

Page 6: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 6/45

 

If chiều dài (M1) > 1 then Push M1 vào stack f i

If chiều dài (M2) > 1 then Push M2 vào stack f i

Od

End

4.2 Phân tích Thuật toán Q

Cũng như trong các thuật toán sắp xếp khác, hai yếu tố đóng vai trò quyết địnhtrong việc đánh giá độ phức tạp của Thuật toán Q là A N, số phép so sánh khóa, và B N, số phép đổi chỗ (hoán vị 2 mẫu tin). Ta sẽ phân tích hai đại lượng này dưới đây:

Trường hợp trung bình

a) ( ) N   N  A mean A=

Gọi  Nk  P  là xác suất để k  A N  = . Trong bước phân chia đầu tiên N r l  == ,1 . Số

 phép so sánh khóa trong vòng lặp Repeat…Until là  N+1 nên 0=k  N  P  nếu

r  N k  +< . Cũng trong bước này, nếu giả thiết dữ liệu hoàn toàn ngẫu nhiên,

mẫu tin R[1] sẽ được dời đến đúng vị trí S với xác suất N 

1. Khi ấy ta được 2

mảng con cần xử lý tiếp là (1, S-1) và (S+1, N). Trong việc sắp xếp mảng con(1, S-1) số phép so sánh cần thiết có thể lấy giá trị tùy ý 10 −−≤≤ N k h vớixác suất 1,S h P − . Đồng thời việc sắp xếp mảng (S+1, N) cần đúng k-N-1-h phépso sánh. Do đó ta có công thức truy chứng:

(7)1

1, , 11 0

1  N k N  

 Nk S h N S k N hS h

 P P P   N 

− −

− − − − −= =

= ∑ ∑

Gọi )( z  A N  là hàm sinh của phân bố xác suất k  Nk 

 P  }{ .

Ta có do (7)

1

11 1

1, , 1

1 1 0

1

1, ,

1 0 0

( )

1

1

  N Nk  

k N 

  N k N    N k N  

S h N S k N h

S k N h

 N k  N k 

S h N S k h

S k h

  A z P z  

  z P P z   N 

  z P P z   N 

≥ +

− −+ − −

− − − − −= ≥ + =

+− − −

= ≥ =

=

=

=

∑ ∑ ∑

∑ ∑∑

(8) 11

1

1( ) ( ) ( )

 N  N 

 N S N S   s

 A z z A z A z N 

+− −

=

= ∑

Suy ra:

- 6 -

Page 7: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 7/45

 

11

1

1 1

1' (1) ( 1 ' (1) ' (1))

1 11

 N 

 N   N S N S  S 

 N N 

S N S 

S S 

 A A N A A N 

 N A A N N 

− −=

− −

= =

= = + + +

= + + +

∑ ∑

1

0

21 N 

 N S 

 A N A N 

=

= + + ∑

Đây chính là công thức truy chứng đã được giải trong Ví dụ 1 của §6, Chương1 với kết quả là

1

32( 1)( ) 2 ( )

2 N   N  A N H NLn N  += + − ≈

Vậy ( log ) N  A O N N  =

Mặt khác ta có:

1

1

1 1

1 1

1 1

1

0 1 0

2( 1)'' ( 1) ( )

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

4( 1) 2 2( 1) '' (1)

 N 

S N S  N 

 N N 

S N S  S N S 

S S 

  N N N  

 s S    N S S  

S S S 

 N   A N N A A

 N 

  A A A A N N 

 N   N N A A A A

  N N N  

− −

=

− − − −= =

− −

− −= = =

+= + + +

+ + +

+= + + + +

∑ ∑

∑ ∑ ∑

 Như thế '' (1) N N  x A= thỏa hệ thức truy chứng (17) với hệ số  N  f  cho bởi (24)trong Chương 1.

Với điều kiện đầu 1'' 0 A = thì hệ thức (25), Chương 1 có

1

21

1

11

1'' (1) 4( 1)( 2) 12( 1)( 2)

2

16( 1)( 2) 4( 1) 8

 N 

 N k N  k 

 N 

 N k k 

 A N N H N N H   N k 

 N N N H H  

+

+=

+=

= + + − + ++ −

+ + + − + +

Suy ra:

- 7 -

Page 8: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 8/45

 

2

1

1

1

1 1

2 21 1

2 21

1

1

( ) '' (1)

14( 1)( 2) 12( 1)( 2)

2

16( 1)( 2) 4( 1) 82( 1) 3( 1) 4( 1)

12( 1) 9( 1)

1 14( 1)( 2) 4( 1)

2

2( 1)

 N N  N N 

 N 

k N k 

 N 

 N k k 

 N N 

 N 

 N 

 N k h k 

Var A A A A

 N N H N N H   N k 

 N N N H H   N H N N H  

 N H N  

 N N N H  h N k 

 N H 

+

=

+ =

+ +

+

+

= >

= + −

= + + − + ++ −

+ + + − + ++ + − + − +

+ + − +

= − + + + ++ −

− +

∑∑1

21

1

2 1

2 21 1

1 1

1 1

7( 1) 13( 1) 8

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

7( 1) 4( 1) 10( 1)1 1

( 1) 8 4( 1)( 2)2

 N 

 N k k 

 N N N  

 N N 

 N N 

k k k h k  

 N N H  

 N N H H N H  

 N N H N H  

 N H N N  h N 

+=

+ +

+ +− +

= = >

+ + + + +

− + + − + +

= + + + + ++ + + − + +

+

∑ ∑∑

Do đó:1

2 21 1

1

2

( ) 7( 1) 4( 1) 10( 1) ( 1) 8

7 ( log( ))

 N 

 N N N k  k 

c Var A N N H N H N H  

 N O N N  

+ +=

≤ ≤ + + + + + + + +

= +

 Như thế độ lệch б=O(N) khá bé so với ( log ) N  A O N N  =

 b) ( )n N  Bmean B =

Gọi b Nst là xác xuất để trong phép phân chia mảng (1,N), mẩu tin X[1] được dờiđến vị trí đúng là S, và có t mẩu tin bên trái được đổi chỗ với t mẩu tin bên phải.Ta có:

( )( )S  N 

t  Nst S  N S 

 N b

−−−−= 1)!()!1(!

1

( )( )( )1

1

1

−−

= N  

S  N  

 N  

Tương tự như trong a) ta có:

( )∑∑=

=

−− ++= N 

S  N S  Nst  N  B Bt b B1

1

0

1

Thay thế giá trị của b Nst vào ta được:

(9) ( ) ( )( ) ( ) ( )( )S  N 

 N 

S  N S S  N 

 N 

t  N 

 N 

S B Bt  B N 

−−

=

=

−−−

=

=

−−− ∑∑∑∑ ++=

1

0

1

1

1

1

1

0

11

1

- 8 -

Page 9: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 9/45

 

Với N,S cố định sao cho 1≤S≤N, số cách chọn tùy ý một tập con S-1 phần tử của{1,2,…,N-1} cũng là số cách chọn 1 tập con E có S-1-t phần tử của {1,2,…,S-1}và 1 tập con có t phần tử của {S,…,N-1} với 0≤t≤S-1 tùy ý. Do đó:

( )( ) ( )1

1

1

0

1

1

=

−−

−−=∑

N  

S  N  

t S 

hay:

(10) ( )( ) ( )1

1

1

0

1 −

−−

=

− =∑N  

S  N  

Mặt khác:

( )( ) ( ) ( ) ( )!

...11

0

1

0

1

t S  N S  N t t 

S  N 

−−−=

−−

=

−−

=

∑∑

( ) ( ) ( ) ( )( )!1

...11

0

1

−−−−−

−= ∑−

=

t S  N S  N S  N 

( ) ( )( )S  N 

S  N −−

=

∑−= 1

1

1

0

1

Lý luận tương tự như trên ( )( )S  N  

−−

=

∑1

1

1

0

1 là số cách chọn tập hợp con S-i

 phần tử của tập hợp N-2 phần tử. Do:

(11) ( )( ) ( )( )2

2

1

0

1 −−

−−

=

− −=∑ N 

S  N 

t S  N t 

( )( ) ( )1

11

1 −−

−−= N 

 N 

S  N S 

Từ (9), (10), (11), ta có:( ) ( )∑

=−−

++

−−−

= N 

S  N S  N  B B N 

S  N S 

 N  B

1

1

1

11

= ( ) ( ) ∑∑∑−

===

+−

−−

−−+ 1

01

2

1

2

11

1

1

1 N 

 N 

 N 

 B N  N 

 N S 

 N  N S 

 N  N 

 N 

∑−

=

+−=1

0

2

6

2 N 

S  N  B N 

 N  B

Đây là hệ thức truy chứng đã giải trong ví dụ 3 chương I với kết quả là:

( ) ( ) ( ) N  N  N  H  N  B  N  N  ln3

1

134

1

13

11 ≈+−+= +

Tóm lại độ phức tạp trung bình của thuật tóan Q là O(N logN)Trường hợp xấu nhất và tốt nhất:Khi mảng đã được xếp thứ tự tăng thì ở mỗi bước phân chia, phần tử bé nhất đượcgiữ nguyên chỗ và ta được một mảng con với 1 phần tử ít hơn trước. Do đó cầnđến N bước mới chấm dứt thuật tóan. Suy ra số phép so sánh là N(N+1)=O(N2).

- 9 -

Page 10: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 10/45

 

Đó chính là trường hợp xấu nhất đối với phép so sánh trong khi số phép dời chỗlại ít nhất và bằng N.Để tránh nghịch lý trên, ta có thể chọn khóa cầm canh cho phép phân chia là khóa

của phần tử giữa    

  

 

+

2

r l  K  của mảng con (l,r). Khi ấy chỉ có log2 N bước chia nếu

mảng ban đầu đã có thứ tự. Do đó số phép so sánh là (N+1)log2 N trong khi số phép dời chỗ chỉ là log2 N. Đây chính là trường hợp tốt nhất cho cả số phép so sánhvà phép dời chỗ. Chú ý rằng nếu mảng được sắp xếp thứ tự giảm, với cách chọn

 phần tử cầm canh như trên, số phép so sánh vẫn là (N+1)log2 N trong khi số phépdời chỗ không tệ lắm: N+log2 N.Ta cũng có thể xây dựng ví dụ trong đó cả số phép so sánh lẫn dời chỗ đều làO(N2) bằng cách chọn phần tử ở giữa của mảng con tận cùng bên phải là phần tửlớn nhất trong khi phần tử ở giữa của các mảng con khác được đặt đúng chỗ.

4.3 Thuật toán Mergesort (MS) và Heapsort (HS)

Tuy thuật toán Quicksort rất tốt trong trường hợp trung bình, nhưng độ phức tạp của nó trở thành O(N2) trong trường hợp xấy nhất. Trong nhiều ứngdụng, một yêu cầu được đặt ra là tìm một thuật toán có cấp O(NlogN) ngay trongtrường hợp xấu nhất.Các thuật toán MS và HS là 2 trong số đó.

Thật ra MS là một trong những thuật toán sắp xếp đầu tiên chạy trên máytính được đề nghị. Nó được gợi ý bởi Von Neumann ngay từ 1945. Thuật toán nàyđược dựa trên ý tưởng trộn (merge) 2 mảng có thứ tự thành 1 mảng có thứ tự duynhất.

Hãy xem ví dụ trộn 2 mảng có thứ tự: 503, 703, 765 và 087, 512, 677 thành1 mảng có thứ tự. Đầu tiên ta so sánh 2 phần tử bé nhất của 2 mảng và output phần

tử bé hơn vào mảng phụ. Sau đó lại tiếp tục quá trình với 2 mảng còn lại cho đếnkhi 1 mảng trở thành rỗng. Các bước trên được minh họa như sau:

- 10 -

503 703 765

087 512 677

503 703 765087

512 677

703 765087 503

512 677

Page 11: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 11/45

 

Đấy là ý tưởng chính của thuật toán M cho phép trộn 2 mảng có thứ tựX[1]<X[2]<……<X[M] và Y[1]<Y[2]<……<Y[N] thành 1 mảng duy nhấtZ[1]<Z[2]<……<Z[M+N]

Thuật toán M

Begin

i:=1; j:=1; k:=1;while (i≤M ) AND (j≤ N) do

if X[i] ≤Y[j] thenZ[k]:=X[i];k:=k+1; i:=i+1;

elseZ[k]:=Y[j];k:=k+1; j:=j+1;

fiod

if i>M thenfor l:=j to N doZ[M+j]:=Y[j]

OdElse

For l:=i to M doZ[N+i]:=X[i]

Odfi

End

4.4 Phân tich thuật toán M:Ta xét 2 trường hợp:• Trường hợp 1 : tồn tại k, 0≤k<N sao cho(12) Y[k]<X[M]<Y[k+1]Khi ấy số phép so sánh là:(13) C=M+k  • Trường hợp 2: tồn tại h, 0≤h<M sao cho(14) X[h]<Y[N]<X[h+1]Khi ấy số phép so sánh là:(14) C=N+h

Do đó giá trị cực đại và cực tiểu của C là:Min C = min(M,N)Max C = M+N-1

- 11 -

Page 12: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 12/45

 

Để tìm giá trị trung bình của C, ta giả sử

+M 

 N M có thể đan xen M giá trị X vào N

giá trị Y đều xuất hiện với cùng xác suất. Nếu (12) xảy ra thì M-1phần tử X[1],X[2], …, X[M-1] có thể được đan xen tuỳ ý vào k phần tử Y[1],Y[2],…, Y[k] đểcho số phép so sánh là (13). Tương tự nếu (14) xảy ra thì ta có thể đan xen tuỳ ý

 N-1 phần tử Y[1],Y[2],…,Y[N-1] vào h phần tử X[1], X[2], …, X[h] cho tổng số phép so sánh là (15). Như thế:

Suy ra:(16) C  = M + N -  µ MN

Trong đó  µ MN =1+ N 

M +

1+M 

 N 

Ta cũng có thể chứng minh rằng (bài tập) phương sai bằng:

Var(C) =)2)(1(

)2(

++

+

 N  N 

 N M M +

)2)(1(

)2(

++

+

M M 

M  N  N -  µ 2MN

Đặc biệt nếu M=N ta có:

C  = 2N -1

2

+ N 

 N = 2N – 2 + O(

 N 

1)

Và Var(C) =)2()1(

 N)22(2

2

++−

 N  N 

 N = 2 + O(

 N 

1)

- 12 -

+M 

 N M C  = ∑

=

+1

0

)( N 

k M 

+−M 

k M  1+ ∑

=

+1

0

)(M 

h

h N 

+− N 

h N  1

 

=

+1 N 

 

=

+1M 

Page 13: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 13/45

 

Độ lệch: σ   = 2 + O( N 

1)

 Như vậy C  biến động quanh quẩn giá trị MaxC= 2N-1. Ta có thể sử dụng thuậttoán M để sắp xếp bằng phép trộn (Mergesort) 1 mảng X[1],X[2],…,X[N] mà ýtưởng chính được trình bày trong trường hợp N=2m. Ta cần có 1 bộ nhớ phụ chiều

dài N. Đầu tiên ta xem mảng như là N mảng con có chiều dài 1 và sử dụng thuậttoán M để trộn từng đôi mảng con liên tiếp tạo thành

2

 N mảng con có thứ tự chiều

dài là 2. Các kết quả được ghi vào mảng phụ. Tiếp theo ta trộn từng đôi mảng conliên tiếp có chiều dài 2 của mảng phụ thành N/4 mảng con có thứ tự chiều dài 4.Kết quả được ghi vào mảng chính.Cứ như thế, sau m bước ta được mảng có thứ tựchiều dài N.Số phép dời chỗ tổng cộng rõ ràng bằng: Nm= Nlog2 NSố phép so sánh tối đa là :

( ) N  N  N  N  N 

 N 

m

i

i

i 21

2

1

lo g12lo g12.22m a x ∑=

≈+−=−=

Còn số phép so sánh tối thiểu là:  N  N  NmC  2log2

1

2

1min ==

Trong khi đó số phép so sánh trung bình là :

 N  N  Nm N 

m

i

m

i

ii

i

i

i 2

1 111

1

lo g12

1

12

22

2∑ ∑

= =−−

≈+

−=   

  

 +

−=

Kết quả xấp xỉ trên vẫn đúng khi N không phải là lũy thừa của 2.Chú ý rằng số phép dời chỗ của thuật toán MS, )(44.1log

2N  NLn N  N  ≈

Lớn hơn gần 30% so với số phép dời chỗ trung bình của thuật toán Q, )(31*3 n Ln  

(nhắc lại một số phép dời chỗ trong thuật toán Q tương đương với 3 phép gán).Mặt khác nếu chạy thử nghiệm với các dữ liệu kiểu nguyên thì bên cạnh tổng số

 phép dời chỗ và so sánh trung bình là  N  N 2

log2 , ta cần cộng thêm thời gian kiểmtra ở mỗi bước lặp xem đã vượt quá chiều dài mảng con đem trong chung(brokeeping). Khi ấy thời gian tổng cộng trung bình )(32,4log3 2 N  Ln N  N  = , vẫnlớn hơn thời gian tổng cộng trung bình của thuật toán Q,3Ln(N) khoảng 25%Dĩ nhiên ưu điểm của thuật toán MS là trong trường hợp xấu nhất nó vẫn có cỡ O(NlogN). Tuy nhiên nhược điểm lớn nhất là thuật toán này đòi hỏi một bộ nhớ có

chiều dài 2N để sắp xếp mảng có chiều dài NThuật toán H(heapsort) sẽ giải quyết được khó khăn về bộ nhớ : đây làthuật toán sắp xếp tại chỗ mà độ phức tạp trong trường hợp xấu nhất vẫn làO(NlogN)

Thuật toán này được dựa trên khái niệm “heap” định nghĩa như sau:Định nghĩa 5.1: Một mảng R[1],R[2],…,R[N] được gọi là một heap nếu các khóacủa nó thoả

- 13 -

Page 14: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 14/45

 

(17) [ ]  j K   j

 K  ≥

2 N  j

 jl  ≤<

≤2

Trong đó

2

  j chỉ số nguyên lớn nhất

2

  j≤

Từ định nghĩa trên ta thấy ngay K[1] luôn luôn là phần tử lớn nhất của một heapHình dưới đây là ví dụ của một heap với 15 phần tử

Để tạo thành một heap từ một mảng tùy ý, ta được dùng ý tưởng sau củaR.W.Floyd (1964)

Giả sử các khóa đã thỏa (18) [ ]  j K   j

 K  ≥

2 N  j

 jl  ≤<

≤2

Với l là một số nguyên 1≥

Ta sẽ sắp xếp lại mảng sao cho điều kiện vẫn thỏa với  N   j  j

l  ≤<

2

Đặt R=R[l] nếu K[l]<K[2l] hay K[l]<K[2l+1], ta sẽ dời mẫu tin R[j] có

khóa lớn nhất trong số R[2l] , R[2l+1] lên vị trí l (ta nói R[j]) đã được sàn lên vị tríl). Quá trình này có thể phá vỡ điều (18) nên ta cần so sánh khóa của R với khóacủa R[2j] và R[2j+1] để sàn 1 trong 2 mẫu tin trên lên vị trí j nếu cần. Cứ tiếp tụcnhư vậy cho đến khi không còn sàn được nữa ta sẽ tìm được đúng vị trí để chèn R 

vào và khi đó (18) được thỏa với. N   j  j

l  ≤<

2

Với cách trên, ta có thể xuất phát từ

=

2

 N l  (khi ấy 18 thể hiện đúng) và đi ngược

dần đến lúc l=1, nghĩa là (17) được thỏa.Đặt  N m 2log= và  N k  2log= . Trong quá trình sàn đến vị trí l như trên, ta

đã sử dụng tối đa m-k phép gán và 2(m-k) phép so sánh. Do đó số phép gán tối đalà )(22

2

122...2.22

1

1

021 N Om  jm

mm

  j  j

mmm =−−==+++ +

=

−− ∑Số phép so sánh tối đa gấp đôi số trênSử dụng quá trình tạo heap như vậy ta được

4.5 Thuật toán H (Heapsort) Begin

- 14 -

908

897 765

653 703

612677509426

275512

061 170 154503

Page 15: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 15/45

 

Tạo heap R[1],R[2],…,R[N] For r:=N downto 2 do

 Đổi chỗ R[1] và R[r];Sàn lên để tạo heap R[1],….R[r-1]

Od 

 End 4.6 Phân tích thuật toán H:

Số phép gán (so sánh) tối đa để đưa các phần tử R[2m],R[2m+1],…,R[N]vào đúng chỗ là m(2m). Tương tự số phép gán (so sánh) tối đa để đưa R[2m-1],R[2m-1-+1],….,R[2m-1] vào đúng chỗ là m-1(2m-2). Tiếp tục như thế ta được số

 phép gán tối đa của thuật toán H là:

 N  N m z dz 

d mm

m

 z 

m

  j

  jmmm

2

1

11

01log12)1()2(22...2).1(2 ≈−−==++−+ +

==

− ∑

Số phép so sánh tối đa khoản  N  N  2log2

Rất khó để đánh giá vế mặt lý thuyết số phép gán và so sánh trung bình.Tuy nhiên thực nghiệm cho thấy các giá trị trung bình thay đổi khá gần giá trị tốiđa nêu trên. Như thế thuật toán H còn kém hiệu quả hơn thuật toán MS một ít. Tuynhiên ưu điểm của nó là một thuật toán sắp xếp tại chỗ.

 Ngoài ra cấu trúc heap có thể được sử dụng để xây dựng một cấu trúc dữliệu mới là hàng ưu tiên. Thay vì phần tử vào trước được ưu tiên ra trước, ta ưutiên cho phần tử của khóa lớn nhất (hay nhỏ nhất tùy theo ứng dụng) được ratrước. Hàng ưu tiên có nhiều ứng dụng trong việc thi hành sơ đồ lặp trong tínhtoán số hay trong việc sắp xếp lịch cho các công việc trong các hệ điều hành, đặt

 biệt là hệ điều hành song song.

Để cài đặt hàng ưu tiên ta có thể dùng một mảng tuyến tính hoặc mảngtuyến tính sắp thứ tự. Tuy nhiên khi đó việc duyệt hay chèn, hủy một mẫu tin đòihỏi cỡ O(N) phép toán

 Ngược lại nếu ta sử dụng cấu trúc heap để lưu giữ hàng ưu tiên, thì phần tửở đỉnh của heap là phần tử lớn nhất nên được ưu tiên ra trước. Quá trình cập nhậtchình là quá trình sàn lên nên chỉ cần tối đa log2 N phép dời chỗ và 2log2 N phép sosánh.

Bài tập:

1. a. Tìm bảng nghịch thế của hoán vị (271845936). b. Tìm hoán vị tương ứng với bảng nghịch thế 50121200.

2. Cho trước hoán vị (a1, a2, .., an) tương ứng với bảng nghịch thế b1, b2, …, bn.

Hãy xác định hoán vị naaa ...

21 tương ứng với bảng nghịch thế (n-1-b1)(n-2-

 b2)…(0-bn)

- 15 -

Page 16: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 16/45

 

3. a. Viết lại thuật toán cho phép xây dựng phép hoán vị tương ứng với 1 bảng

nghịch thế như trình bày trong chương chứng minh của định lý 2.

 b. Chứng minh rằng độ phức tạp của nó là O(n2).

c. Có thể cải tiến được thuật toán trong câu a để độ phức tạp của nó làO(nlogn) không?

4. Thiết kế một thuật toán cho phép tìm bảng nghịch thế của một phép hoán vị

với độ phức tạp O(nlogn).

5. Một tập hợp S các cặp có thứ tự được nói là bắc cầu nếu: (a, b), (b, c) ∈ S ⇒

(a, c) ∈ S

a. Giả sử π = (a1a2…an) là một hoán vị của n phần tử. Đặt

E (π ) = {(ai, a j); i < j, ai > a j}

   E  (π ) = {(ai, a j); i > j, ai > a j}

Chứng minh rằng E (π ) và  E  (π ) bắc cầu.

 b.  Ngược lại cho trước một tập con bắc cầu E của T = {(x, y); 1 ≤ y < x ≤ n}

sao cho phần bù T\E cũng bắc cầu. Chứng minh rằng tồn tại một phép hoán

vị π sao cho E(π ) = E.

6. Với các ký hiệu trong bài 5, chứng minh rằng nếu π 1 và π 2 là 2 phép hoán vịvà E là tập bắc cầu nhỏ nhất chứa E(π 1) ∪ E(π 2) thì phần bù T\E cũng bắc

cầu. Suy ra tồn tại một hoán vị π sao cho E(π ) = E mà ta ký hiệu là π =

sup(π 1, π 2) (như thế tập họp các phép hoán vị n phần tử tạo thành một dàn).

7. a. Chứng tỏ rằng thuật toán C vẫn còn chạy đúng nếu ta cho phép các khóa

có thể bằng nhau.

 b. Chứng tỏ rằng thuật toán C là bền vững, nghĩa là nếu tồn tại j < i sao cho

K[j] = K[i] thì sau khi sắp xếp, mẩu tin R[j] sẽ đứng trước mẩu tin R[i].

8. Thuật toán C có còn chạy đúng không nếu điều kiện so sánh K[j] < K[i] được

thay đổi bởi điều kiện K[j] ≤ K[i]. Nó còn bền vững không?

9. Viết thuật toán để sắp xếp mảng tại chỗ, với độ phức tạp O(n), sau khi chạy

thuật toán C.

- 16 -

Page 17: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 17/45

 

10. Trong thuật toán C, giả sử các khóa đều lấy các giá trị nguyên gồm giữa 2 cận

u, v. Hãy thiết kế một thuật toán tương tự như C trong đó sử dụng mảng phụ

Count[u], Count[u+1], …, Count[v] để đếm các khóa có giá trị ≤ một khóa

cho trước. Đánh giá độ phức tạp của thuật toán theo biến N và M = v – u.11. Cần viết thêm thuật toán sắp xếp tại chỗ như thế nào sau khi chạy thuật toán

trong bài 10. (Tương tự như bài 9).

12. Thuật toán S có bền vững theo nghĩa trong bài tập 7?

13. Thuật toán S có còn chạy đúng không khi điều kiện thoát K < K[i] cùa vòng

lặp while … do được thay đổi bởi K ≤ K[i]. Nó có còn bền vững không?

14. Tìm khoảng cách di chuyển trung bình của một mẫu tin trong quá trình sắp xếp

(HD: gọi π là phép hoán vị tương ứng, tính giá trị trung bình của | π (1) - 1|

+ | π (2) – 2| + … + | π (N) – N|).

15. Thuật toán Q sẽ hoạt động như thế nào nếu tất cả các khóa đều bằng nhau.

16. Tính số phần tử lớn nhất có thể được lưu trong stack vào một lúc nào đó trong

thuật toán Q.

17. Tìm phép hoán vị của 23 phần tử sao cho khi dùng thuật toán Q để sắp xếp

mảng tương ứng với hoán vị trên, tổng số phép so sánh và dời chỗ là ít nhất.

18. Thay vì sắp xếp toàn bộ mảng, ta chỉ muốn tìm M phần tử bé nhất trong số N

 phần tử. Hãy thay đổi thuật toán Q để thực hiện điều trên với số phép so sánh

và dời chỗ giảm bớt. Hãy đánh giá phép so sánh và dời chỗ trung bình, chiều

dài của stack theo M và N.

19. Hãy thiết kế một thuật toán cho phép xếp các số âm trong 1 mảng đi trước các

số dương (bản thân các số âm cũng như các số dương không sắp thứ tự).

Thuật toán của bạn cần số lần dời chỗ ít nhất.

20. Có thể thực hiện Merge Sort mà chỉ cần dùng bộ nhớ phụ có chiều dài2

 N thay

vì N không?

21. Cho một mảng chiều dài N sao cho các khóa của các mẫu tin thỏa:

K[1] ≤ K[2] ≤ … ≤ K[M] và K[M+1] ≤ … ≤ K[N]

- 17 -

Page 18: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 18/45

 

Có thể nào sắp xếp mảng trên với thời gian O(N) mà chỉ sử dụng một số ít bộ

nhớ phụ không phụ thuộc vào N không?

22. Chứng tỏ rằng có thể dùng hàng ưu tiên để quản lý hàng đợi bình thường hay

stack.23. Hãy thiết kế một thuật toán cho phép chèn một mẫu tin mới vào một heap có N

 phần tử để tạo thành một heap có N + 1 phần tử.

24. Hãy thiết kế một thuật toán cho phép hủy một mẫu tin bất kỳ của một heap có

 N phần tử để tạo thành một heap có N - 1 phần tử.

- 18 -

Page 19: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 19/45

 

Chương 3: Phân tích thuật toán tìm kiếm

< 1- 12 chưa có bài gõ>

1. Cây nhị phân

- 19 -

Page 20: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 20/45

 

< 1- 12 chưa có bài gõ>

2. Tìm kiếm tuần tự2.1 Phân tíchGiả sử có môt mảng gồm N mẫu tin R[1],R[2],...,R[n] với khóaK[1],K[2],...,K[N]. Bài toán được đăt ra là tìm mẫu tin có khóa K[i]=K, trong đó K là môt giá trị khóa cho trước.Thuât toán tìm kiếm tuần tự sẽ duyêt lần lượt các khóa cho đến khi tìm được khóa

 bằng K. Để tiên, ta thêm môt mẩu tin giả R[N+1] với khóa K[N+1]=K.

2.2 Thuât toán S 

Begin i:=0;Repeat

i = i+1;Until K[i]=K;

EndKết thúc thuât toán S, giá trị i sau cùng được trả về cho biết vị trí của mẫu tin có khóa bằng K. Nếu i ≤ N thì tìm kiếm thành công, còn nếu i = N+1 thì tìm kiếmthất bại.

2.3 Phân tích thuật toán S Đô phức tạ p của thuât toán S tỉ lê với số phé p so sánh C (cũng bằng số phé p gán).

 Nếu tìm kiếm thất bại thì C = N+1, còn trong trường hợ p thành công, C ≤ N. Để tìm giá trị trung bình  N  

C   của C, ta giả sử các khóa đều xuất hiên với cùng xác

suất N 

1. Khi ấydo môt kết quả tương tự với ví dụ 2, §7, chương , ta được:

 N C  N 

1=

với phương sai là 12

12 − N  . Do đó, đô lêch là :

132

1 2 −= N σ   = O(N)

Trên thực tế, các khóa sẽ xuất hiên với xác suất p1, p2,...,p N sao cho 11

=∑=

 N 

ii

 p .

Khi ấy, giá trị trung bình sẽ là:

 p p p N 

 N N C  +++= ...2

21

- 20 -

Page 21: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 21/45

 

Giả sử ta có thể sắ p xế p lại các mẫu tin theo môt thứ tự sao cho phé p tìm kiếmtrung bình tốt nhất, nghĩa là   NC  là tối tiểu. Khi ấy ta có:

(4) p1 ≥ p2 ≥ ... ≥ p N

htât vây, nếu có i<j sao cho pi < p j thì ta có thể hoán vị 2 mẩu tin R[i] và R[j] để được môt mảng mới mà số phé p so sánh thành công trung bình  N 

C ′ thỏa:

0))(( >−−=−−+=′− i  ji  j  ji N  N  p pi  j  jpip  jpipC C 

 Như thế   N  C  không tối tiểu. Suy ra xác suất xuất hiên của các khóa phải thỏa (4),

nghĩa là mẩu tin được tìm kiếm nhiều nhất phải được đăt ở đầu.Dưới đây ta sẽ xét môt số ví dụ phân bố xác suất của khóa thỏa (4):

Vi du 1:

11121

2

1,

2

1,...,

4

1,

2

1−−− ====

 N  N  N  N p p p p

1

1

1 22−

=

+=∑ N 

 N 

ii N 

 N iC 

Đăt1

1)(

1

0 −−

==∑−

= z 

 z  z  z G

 N  N 

i

i

Khi ấy 222)2

1(

2

1

2

1

1<−=′+= −

− N 

 N  N  G N 

 Như vây chỉ cần so sánh trung bình ít hơn 2 khóa ta sẽ tìm được khóa cầntìm trong trường hợ p thành công.

Ví dụ 2:Trong thực tế, ít khi ta gă  p phân bố xác suất như trên. Xét phân bố xác suấtnhư sau:

C p...,1)C,-(N p NC, p  N21 ===

Trong đó hằng số C thỏa:

12

)1()1(

11

=+

=−+= ∑∑==

 N  N C i N C  p

 N 

i

 N 

i

i

hay

)1(

2

+=

 N  N C 

Khi ấy

3

2

6

)2)(1(

2

)1()1(

1

2 +=

++−

+=−+= ∑

=

 N  N  N  N  N  N C i N iC C 

 N 

i

 N 

 Như thế trong trường hợ p tìm kiếm thành công , thuât toán chạy nhanh gấ prưỡi so với khi các khóa được phân bố xác suất đều.

Ví dụ 3:

- 21 -

Page 22: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 22/45

 

Thât ra phân bố xác suất trong ví dụ 2 cũng rất giả tạo. Ta hãy xét môt phân bố xác suất thực tế hơn, dựa trên ”luât Zipf”

 N 

C  p

C  p

C  p

 N === ,...,

2,

121 với

 N  H C 

1=

Luât Zipf phát biểu rằng “từ thứ n thông dụng nhất trong văn bản ngôn ngữ 

tự nhiên xuất hiên với tần số tỉ lê nghịch với n”. Zipf cũng nhân xét rằng luât trêncũng đúng cho các bảng thống kê mât đô dân số của môt thành phố lớn và cácvùng phụ cân.Với phân bố xác suất thoả luật Zipf như trên ta có

 N 

 N  H 

 N 

i

icC  == ∑

 Như vậy thời gian tìm kiếm thành công trung bình nhanh gấp )(2

1 N  Ln lần so với

khi các mẫu tin được xếp ngẫu nhiên.

Ví dụ 4: Một phân bố xác suất cũng rất thực tế được dựa trên qui tắc “80-20” quansát được trong các ứng dụng thương mại: 80% tác vụ liên quan đến 20% của tậptin được tìm kiếm thường nhất của một tập tin; cũng thế 64% tác vụ liên quan đến4% của tập tin được tìm kiếm nhiều nhất, …. Như thế:

 p1 + p2 + … + p0,2n ≈ 0,8 (p1 + p2 + … + pn), 5≤  n ≤   N 

Một phân bố thoả mãn chính xác hệ thức trên (dấu = thay vì ≈ ) cho mọi n là bộicủa có thể được chọn như sau:

Việc tính toán trên phân bố (5) khá phức tạp nên ta sẽ xét một phân bố xấp xỉ luật80-20 được dựa trên đánh giá:

(5) p1 = c, p2 = (2θ - 1)c, …, p N = (Nθ - ( N -1)θ )c

với c =θ  

 N 

1, θ được chọn sao cho

 p1 + p2 + … + p0,2n = 0,8 (p1 + p2 + … + pn)

nghĩa là (0,2n)θ c = 0,8 nθ c

hay 0,2

θ

= 0,8

Suy ra θ =)2,0log(

)8,0log(≈ 0,1386

Việc tính toán trên phân bố (5) khá phức tạp nên ta sẽ xét một phân bố xấp xỉ luật08-20 dựa trên đánh giá:

- 22 -

Page 23: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 23/45

 

nθ - (n – 1)θ = θ nθ -1 + (1 + O(n

1))

Phân bố xấp xỉ được chọn như sau:

(6) p1 = c, p2 = θ  −12c , …, p N = θ  −1c N  , với c = )1(1 θ  −

 N  H 

trong đó )1( θ  − N 

 H  = 1 +θ  −12

1+ . . . +

θ  −1

1

 N 

Chú ý rằng khi θ = 0 ta được phân bố Zipf.

Với phân bố (6) ta có

)(1θ

θ 1

)1(

)(

θ 

θ 

θ 

−−

++

== N O N 

 H 

 H C 

 N 

 N 

 N  ≈ 0,122 N 

2.4 Phân tíchTrong thực tế ta không biết phân bố xác suất mà chỉ có thể đếm số lần mỗi mẩutin được truy tìm rồi phân bố lại các mẩu tin dựa trên thông tin này. Tuy nhiên cóthể ta không muốn dành nhiều bộ nhớ cho việc thu thập thông tin. Thật ra có mộtcách đơn giản nhưng hiệu quả đã được sử dụng từ lâu mà không rõ xuất xứ là tạora một mảng tự tổ chức: khi một mẫu tin được truy cập xong, ta sẽ đưa nó ra đầumảng, sẵn sàng để được cập nhật nhanh trong lần tới.

Thật vậy, giả sử các khoá xuất hiện với xác suất p1, p2, …, pN và các lần truy cậpđộc lập với nhau. Khi ấy John McCabe đã chứng mih (1965) rằng về lâu về dài số

 phép so sánh trung bình khi tìm kiếm thành công sẽ dần về giới hạn:

(7) ∑∑ ++=

++=

≤<≤ ji ji

  ji

 N   ji ji

  ji

 N  p p

 p p

 p P 

 p pC 

,1 2

121

Chẳng hạn nếu các khoá xuất hiện hoàn toàn ngẫu nhiên, N 

 pi

1= (1 ≤ i ≤   N ), thì

giới hạn trên không gì khác hơn2

1+ N . Trong trường hợp tổng quát, giá trị trung

 bình (7) sẽ bé hơn 2 lần giá trị tối ưu (3) vì:

∑∑==

<−+≤ N 

  j

  j

 N 

  j

  j N  jp p  jC 11

2)1(21

Mặt khác, nếu phân bố xác suất tuân theo luật Zipf thì:

∑∑≤≤≤≤ +

+=

+

+= N   ji N   ji

 N   ji

  j

c

i

c

  j

c

i

c

C ,1,1

1

2

1.

2

1

∑∑∑==

+=

+ −+=−+= N 

i

i

 N 

i

i N i

 N 

i

i N H c H c H  H 

1

2

11

22

1)(

2

1

- 23 -

Page 24: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 24/45

 

2

1= + c[(2 N +1)H2 N  – 2 N – (2 N +1) H  N  + 2 N ]

2

1= +c[ N Ln(4) – Ln( N ) +O(1)] ≈  

 N 

 N 

2log

2

Kết quả này rất tốt so với trường hợp ngẫu nhiên  N 2

1 , và cũng chỉ bằng khoảng

Ln(4) ≈ 1,386 lần so với số phép so sánh trung bình tối ưu..

<17-19 chưa có bài>

3. Tìm kiếm trên bảng có thứ tự 

<17-19 chưa có bài>Khóa đầu tiên được so sánh với K là K[8] được biểu diển bởi nút gốc mang nhảnsố 8 của cây. Nếu K<K[8] thì ta theo cây con bên trái và so sánh K với K[4].Tương tự, nếu K>K[8] thì ta theo cây con bên phải và so sánh K với K[12]. Tiếptục tìm kiếm như vậy xho đến khi:

− Tìm được một nút có nhản i để K=K[i]: tìm kiếm đã thành công.− Hoặc đi đến một nút lá (có ký hiệu hình vuông) tìm kiếm đã thất bại.

Chẳng hạn khi đi đến nút lá có số hiệu 3 thì có nghĩa là K[3]<K<K[4].Giả sử khóa cần tìm là K=K[11]. Khi ấy theo thuật toán B, ta cần thực hiện các

 phép so sánh khóa K với K[8], K[12], K[10], K[11], nghĩa là theo đường đi 8-12-10-11 của cây quyết định nhị phân. Ngược lại nếu K[3]<K<K[4] thì ta sẻ đi theođường đi 8-4-2-3 và kết thúc ở nút lá số 3.Trong trường hợp tổng quát, cây quyết định nhị phân tương ứng với thuật toán Bcho mảng có chiều dài N được xây dựng đệ qui như sau: nút gốc của cây mang

nhản

2

 N , cây con bên trái là cây quyết định nhị phân tương ứng với thuật toán B

cho mảng có chiều dài 12−

 N ; trong khi cây con bên phải tương với tìm kiếm

nhị phân trên mảng có chiều dài

2

 N nhưng nhãn của mỗi nút phải được cộng

thêm với

2

 N 

.

Với cách xây dựng cây quyết định nhị phân như trên, ta có thể chứng minh bằngqui nạp định lý sau:Định lý 3.1:

 Nếu hh  N  22 1 ≤≤− thì một tìm kiếm thành công sẽ cần ít nhất 1 và nhiều nhất h phép so sánh.

- 24 -

Page 25: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 25/45

 

 Nếu 12 −= h N  thì một tìm thất bại cần h phép so sánh, trong khi nếu

122 1 −≤≤− hh  N  thì một tìm kiếm thất bại cần h hay h-1 phép so sánh.Chú ý rằng bất kỳ thuật toán tìm kiếm nào dựa trên phép so sánh khóa không trùnglắp (mỗi khóa chỉ được so sánh tối đa một lần) đều có thể liên kết với một câyquyết định nhị phân là một cây nhị phân đủ nhưng không nhất thiết cân bằng như

trong Định lý 3.1Đối với một Thuật toán như vậy, mỗI phép tìm kiếm thành công sẽ chấm dứt ở một nút trong nên số phép so sánh cần thiết chính là chiều dài của đường đi từ nútgốc đến nút đó cộng thêm 1. Mặt khác, một lần tìm kiếm thất bại sẽ kết thúc ở nútlá nên số phép so sánh cần thiết cũng là chiều dài đường đi từ nút gốc đến nút láấy. Để tính số phép so sánh trung bình  N  

C  trong trường hợp tìm kiếm thành côngvà số phép so sánh trung bình '

 N C  trong trường hợp thất bại, ta giải thích rằng các

khóa xuất hiện hoàn toàn ngẫu nhiên (với xác suất là N 

1) và 1+ N  thỏa

[ ])1,( K −∞ , [ ] [ ])2,1( K  K  , [ ] [ ])2,1( K  K  ,…, [ ] ),( +∞ N  K  cũng xuất hiện với

cùng xác suất1

1+ N 

, khi ấy:

(8) N

1 in

 N 

T C  += , với in

T  là tổng đường đi trong

(9) N

1' out  N 

T C  += , với out 

T  là tổng đường đi ngoài.

Do Định lý 1.7, ta có:

10) 1)1

1(' −+= N  N  C 

 N C 

 Ngoài ra ta cũng có (Bài tập)

11)

Định lý 3.2:Thuật toán B là tối ưu, nghĩa là có số phép so sánh trung bình bé nhấttrong số các thuật toán tìm kiếm bằng so sánh khóa không trùng lắp.Chứng minh: Do (9) và (10), ta chỉ cần chứng minh cây quyết định nhị phân ứngvới Thuật toán B có tổng đường đi ngoài bé nhất.Gọi T là cây nhị phân đủ có tổng đường đi ngoài bé nhất trong số các cây nhị phân

đủ N nút trong. Gọi h là chiều cao của T. Giả sử cò một nút bé có mức 2−≤h K  .Ta đổi nút bé này thành nút trong và thêm 2 nút con là nút lá, đồng thời bỏ đi 2 nútlá ở mức h có cùng cha và đổi nút cha này thành nút lá. Khi ấy tổng đường đingoài của T giảm đi một lượng:

( ) ( ) 112212 ≥−−=−+−−− k hk k hh

Điều mâu thuẩn này chứng tỏ T thỏa điều kiện (1) trong hệ quả của Định lý 1.6.Suy ra:

)1(log 2 += N h

- 25 -

( ) ( ) 211

12'' +   

   −   

   += N  N  N  C 

 N C Var 

 N C Var 

Page 26: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 26/45

 

Gọi l là số nút lá ở mức h. Khi ấy tổng đường đi ngoài của T là:(12) ( )( ) ( )( )1111 −++=−−++ h N l hl  N hl 

 Ngược lại gọi 'T  là một cây nhị phân đủ thỏa (1) với chiều cao h và N+1 nút lá.

Gọi 'l  là số nút lá ở mức '

h . Do hệ quả của định lý 1.6, ta có: h N h =+= )1(log 2

'

Trong số các nút trong ở mức h-1, gọi a là nút trong mà nút anh em cũng là núttrong và b là số nút trong có nút anh em là nút lá. Khi ấy '

T  có bah−−

−12 nút láở mức h-1. Suy ra:(13) '1

12 l  N bah−+=−−

Mặt khác 'l  các nút lá ở mức h cũng là các nút con của a+b nút trong ở mức h-1

nên:(14) '

22 l ba =+Từ (13) và (14) ta được:

( ) 212' −+= N l 

Do T cũng thỏa (1) nên ta có:

( )'212 l  N l  h =−+=

 Như thế do (12) tổng đường đi ngoài của 'T  cũng bằng tổng đường đi ngoài của

T và là bé nhất.Cuối cùng rõ ràng cây quyết định nhị phân ứng với Thuật toán B thỏa (1) nên tổngđường đi ngoài của nó cũng bé nhất.

đpcm.Chú ý: Tổng đường đi ngoài bé nhất có dạng:

)1)(1(2)1(2)1)(1( −++−+=−++ h N  N h N l h

  )1(

222)1)1()(1(

+−+++= N  Log  N  Log  N 

Do đó:

)1(

2

'22

1

11)1(

+

+−++= N  Log 

 N   N  N  Log C 

  ε ++= )1(2 N  Log 

Với:

)1(

2222

1

11)1()1(

+

+−++−+= N  Log 

 N  N  Log  N  Log ε 

  θ  θ   21−+=

Trong đó: 1)1()1(0

22<+−+=≤ N  Log  N  Log θ  

Hàm không âmθ  

θ   21−+ đạt giá trị cực đại tại: 2

)2(

 Ln

 Ln Ln

−=θ  

 bằng:

0861,02

)2(11 =

+−

 Ln

 Ln Ln

nên: 0861,00 <<ε 

Mặt khác:

- 26 -

Page 27: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 27/45

 

1)1

1(' −+= C C  N  N   N 

  121

)1)1()(1

1()1(

22 −−+++= + N  Log 

 N  N  Log 

 N 

 

'

2)1)1((1

22

θ  θ  

−++++=N  Log  N  Log 

 N 

với 1)1(0 22' ≤−+=≤ N  Log  N  Log θ  

Ta cũng có: 0867,0210'

''≤−+=<

θ θ ε  và

'22 1)1)1((

1ε +−+++= N  Log  N  Log 

 N C  N 

4. Tìm kiếm trên cây nhị phân

4.1 Thuật toán BThuật toán B tìm kiếm nhị phân tuy rất nhanh nhưng chỉ thích hợp cho các

 bảng ít biến động. Đối với các bảng được cập nhật thường xuyên, còn cần phải đểý đến chi phí cập nhật bảng: khi chèn một mẩu tin mới vào, hay hủy một mẩu tin

ta phải dời trung bình2

 N mẩu tin. Chi phí này còn lớn hơn chi phí tiết kiệm được

do thuật toán B.Trong trường hợp bảng biến động nhiều, thuật toán tìm kiếm trên cây nhị

 phân chẳng những tiết kiệm được chi phí khi tìm kiếm mà còn tiết kiệm được chi phí cập nhật. Hãy xét ví dụ cây nhị phân dưới đây:

- 27 -

Huế

Đà nẵng Hồ Chí Minh

Buôn MêThuột

Điện BiênPhủ

Hải Phòng Lạng Sơn

CầnThơ 

XCà Mau

Hà Nội Vinh

Page 28: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 28/45

 

Trong cây nhị phân trên, các khoá được sắp xếp theo thứ tự tự điển và cây

được duyệt theo thứ tự giữa. Giả sử ta cần tìm khoá “Đà Lạt” trong cây. Đường đi phải chọn là: Huế - Đà Nẵng – Buôn Mê Thuột - Cần Thơ. Đến đây ta gặp một nútlá nên tìm kiếm đã thất bại. Khi ấy nếu muốn ta có thể chèn khoá mới “Đà Lạt”vào thay cho nút lá rồi thêm hai nút lá làm nút con của “Đà Lạt”. Nhờ vậy ta cóthể chèn mẩu tin mới với khoá “Đà Lạt” vào mà không cần dời các mẩu tin khác.Chú ý rằng cây nhị phân trên được xây dựng bằng cách chèn liên tiếp các mẩu tinvới khoá “Huế”, “Đà Nẵng”, “Buôn Mê Thuột”, “Hồ Chí Minh”, “Cần Thơ”, “CàMau”, “Lạng Sơn”, “Điện Biên Phủ”, “Hải Phòng”, “Hà Nội”, “Vinh” từ cây rỗng.

Thuật toán T dưới đây cho phép tìm kiếm và trong trường hợp thất bại thìchèn một mẩu tin mới vào cây nhị phân được duyệt theo thứ tự giữa. Các nút có

kiểu record (mẩu tin) với các trường: khoá, thông tin và 2 trường l, r có kiểu link,trong đó kiểu link là kiểu con trỏ chỉ đến các nút. Các trường l và r trỏ đến (nútgốc của) cây con bên trái và cây con bên phải của nút đang xét. Để tiện ta sẽ sửdụng một nút Head có khoá bằng -∞ (giá trị bé hơn mọi giá trị khoá) và trường r trỏ đến gốc của cây, trường l không được sử dụng. Ngoài ra ta cũng sử dụng mộtnút Tail để làm nút lá ảo chung: một nút có con bên trái (phải) là nú lá sẽ cótrường l (r) trỏ đến Tail. Trường khoá của Tail chứa khoá K phải tìm để làm chothuật toán hiệu quả hơn: mọi tìm kiếm đều thành công, chỉ khi kiểm tra biến Flag

- 28 -

Page 29: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 29/45

 

có phải là True hay False thì mới khẳng định được tìm kiếm thật sự thành cônghay thất bại. Trong thuật toán dưới đây, biến x để chỉ nút hiện hành còn biến p lànút cha của x. Cả hai đều có kiểu link.

Thuật toán T (Tìm kiếm và chèn trong cây nhị phân)Begin

Flag := False;Tail^.Key := K;x := Head;Repeat

p := x;If K < x^.Key Then

x := x^.l;Else

x := x^.r;Fi

Until x^.Key = K;If x = Tail Thennew (x);x^.Key := K;x^.l := Tail;x^.r := Tail;If K < p^.Key Then

p^.l := x;Else

p^.r := x;Fi

Else(“Tìm kiếm thành công”) Flag :=

True;Fi

End

Phân tích thuật toán T

 Nếu cây khoá cân bằng(tối ưu) thì định lý 3.1 cho thấy số phép so sánh tối đa khi

tìm kiếm là [log2(N)]. Tuy nhiên, trong trường hợp xấu nhất khi các khoá đượcchèn vào lần lượt theo thứ tự tăng hay thứ tự giảm thì cây sẽ suy biến hoàn toàn và phép tìm kiếm trở thành tìm kiếm tuần tự trong một bảng có thứ tự. Khi ấy ta đã biết số phép so sánh trung bình là (N+1)/2 = O(N). Cũng thế, nếu các khoá đượcchèn vào theo một thứ tự zigzag thì số phép so sánh trung bình cũng rất lớn.Chẳng hạn như trong ví dụ ở trên, nếu các khoá được chèn vào theo thứ tự: BuônMê Thuột, Vinh, Cà Mau, Lạng Sơn, Cần Thơ, Thành Phố Hồ Chí Minh, Đà

 Nẵng, Hải Phòng, Điện Biên Phủ, Hà Nội, Huế thì khi tìm khoá bắt đầu bằng chữ

- 29 -

Page 30: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 30/45

 

G sẽ cần đến 11 phép so sánh. Rất may mắn là những trường hợp suy biến nhưtrên là không phổ biến. Ta có:

Định lý 4.1: Nếu N khoá được chèn vào cây một cách ngẫu nhiên thì số phép sosánh trung bình cho một lần tìm kiếm vào khoảng 2ln(N) = 1,386 log2(N).

Chứng minh: Giả thuyết “Ngẫu nhiên” có nghĩa là N! cách hoán vị các khoá đểchèn vào tuần tự xuất hiện cùng với xác suất. Nhận xét rằng số phép so sánh cầnthiết để tìm kiếm thành công một khoá nhiều hơn số phép so sánh cần thiết đểchèn nó vào( nghĩa là tìm kiếm thất bại) một đơn vị.

Gọi C N (C’ N) là số phép so sánh trung bình trong một tìm kiếm thành công (thất bại) một khoá K. Để ý rằng K đã có thể được chèn vào một cây rỗng, cây có một phần tử, .. cây có N-1 phần tử với cùng xác suất 1/N nên C’0 + C’1 +.. + C’ N-1 làtổng đường đi trung bình của một cây có N nút. Suy ra tổng đường đi ngoài trung

 bình của một cây có N nút là 2N+∑−

=

1

0

' N 

k C  . Nói cách khác

(15)

(N +1)C’ N = 2N + ∑−

=

1

0

' N 

k C 

Thay N bằng N-1 ta được

 NC’ N-1 = 2(N-1) + ∑−

=

2

0

' N 

k C 

Trừ (15) cho (16) ta được

(N+1)C’ N – NC’ N-1 = 2 + C’ N-1

hay

C’ N – C’ N-1 =1

2

+ N 

suy ra

C’ N = C’0 + ∑+

=

1

2

12 N 

k  k 

(17)C’ N = 2H N+1 – 2 (C’0 = 0)

≈ 2Ln(N)Ta cũng có

C N = (1+ N 

1) C’ N – 1

- 30 -

Page 31: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 31/45

 

= 2 (1 + N 

1) H N+1 – 2(1+

 N 

1) -1

= 2 (1+ N 

1) H N – 3 ≈ 2Ln(N) (đpcm)

4.2 Sắp xếp bằng cách chèn vào cây nhị phânTa có thể thay đổi thuật toán T một ít để được thuật toán sắp xếp bằng cách chènvào cây nhị phân: Sau khi N khoá đựơc chèn tuần tự vào cây nhị phân như trongthuật toán T, ta có thể chép chúng sang một mảng phụ bằng cách duyệt theo thứ tựgiữa. Thuật toán này hơi chậm hơn các thuật toán sắp xếp QuickSort, MergeSort,HeapSort trong trường hợp trung bình, nhất là khi có nhiều khoá có giá trị bằngnhau. Khi ấy cây sẽ suy biến và thời gian sẽ chậm.

Chú ý rằng việc phân tích số phép so sánh trung bình của thuật toán sắp xếp bằngcách chèn vào cây nhị phân rất tương tự với thuật toán Q (Quicksort). Thật vậy,

trong thuật toán Q, các khoá đều được so sánh với phần tử cầm canh đầu tiên k[1]để phân chia mảng thành 2 mảng con. Sau đó các phần tử < k[1] được so sánh với

 phần tử đầu tiên của mảng con bên trái, và cứ thế tiếp tục cho đến hết. Cũng thế,trong thuật toán sắp xếp bằng cách chèn vào cây nhị phân, các phần tử đều đượcso sánh với phần tử cầm canh đầu tiên là k[1](gốc của cây). Sau đó các phần tử <k[1] đều được so sánh với phần tử cầm canh là gốc của cây con bên trái. Tương tựcho các phần tử > k[1], và cứ thế tiếp tục cho đến hết. Từ đó ta thấy số phép sosánh trung bình trong cả hai thuật toán đều là NC N

4.3 Hủy (delete) một nút khỏi cây nhị phân: Nếu nút muốn hủy có một trường link bằng NULL, chẳng hạn trường l , ta

chỉ cần sửa trường link của nút cha, thay vì trỏ đến nó sẽ trỏ đến nút con bên phảicủa nó (hoặc là đổi thành NULL nếu nút muốn hủy có 2 trường link đều bằng

 NULL). Chẳng hạn trong ví dụ ở 4.1, nếu muốn hủy nút Lạng Sơn, ta chỉ cần đổitrường r của nút Hồ Chí Minh cho nó trỏ đến nút Vinh.

Tuy nhiên nếu nút muốn hủy có cả 2 trường link đều khác NULL thì sao?Ví dụ muốn hủy nút Hồ Chí Minh thì sao? Trong trường hợp này ta có một mẹovặt là hãy hủy nút kế tiếp theo thứ tự duyệt giữa (là nút Lạng Sơn trong ví dụ trên)theo cách trên vì nút này chắc chắn có trường l bằng NULL. Sau đó ta chỉ cần đổitrường khóa của nút muốn hủy ( Hồ Chí Minh) thành trường khóa của nút kế tiếpvừa bị hủy tạm ( Lạng Sơn). Đến đây việc hủy đã hoàn thành mà ta chỉ cần sửa đổi

trường khóa và một trường link của nút muốn hủy.Tuy thủ tục hủy khá đơn giản, nhưng có một câu hỏi được đặt ra: nếu hủy

liên tiếp một số mẫu tin thì liệu cây có mất cân bằng và do đó thời gian tìm kiếmsẽ lâu hơn không?

May mắn là ta có:

- 31 -

Page 32: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 32/45

 

Định lý 4.2: (T.Hibhard): Sau khi một nút ngẫu nhiên được hủy khỏi mộtcây ngẫu nhiên theo thủ tục trên thì cây mới vẫn còn ngẫu nhiên.

Chú ý:1. Ta sẽ không chứng minh định lý 4.2. Tuy nhiên để hiểu rõ ý nghĩa của

nó ta hãy xét ví dụ N = 3. Nói rằng cây với 3 nút là ngẫu nhiên có nghĩa là 3! = 6 phép hoán vị của 3 giá trị khóa để chèn vào tuần tự đều xuất hiện với cùng xácsuất 1/6. Hãy xét 1 cấu hình τ như sau:

Ta có thể đạt đến cấu hình trên bằng một trong hai phép hoán vị (2 1 3)hay (2 3 1), nghĩa là xác suất của cấu hình τ là:

P(τ) = 2/6 = 1/3

Mặt khác có 4! = 24 phép hoán vị của 4 giá trị khóa để tạo cây ngẫunhiên với 4 nút. Các phép hoán vị này đều xuất hiện với cùng xác suấtvà cho ta 14 cấu hình khác nhau (một số cấu hình có xác suất cao hơncấu hình khác). Ta coi 1 cấu hình:

Cấu hình trên có thể tạo từ 1 trong 3 phép hoán vị (2 1 3 4), (2 3 1 4),(2 3 4 1). Với mỗi phép hoán vị trên, ta có thể hủy tùy ý một trong 3nút 2,3,4 để tạo ra cấu hình τ. Tương tự như vậy nếu xét tất cả cấu hìnhcây nhị phân 4 nút và các phép hủy một nút thì sẽ thấy có 32 trườnghợp hủy để tạo ra cấu hình τ. Như vậy xác suất để sau khi hủy ngẫunhiên 1 nút từ cây ngẫu nhiên 4 nút sẽ nhận được cấu hình τ là:

Q(τ) = 32/96 = 1/3Đẳng thức giữa P (τ) và Q(τ) cho mọi cấu hình cây 3 nút chính là khẳngđịnh của định lý 4.2 trong trườ hợp N = 4.

2. Định lý 4.2 tuy rất đẹp về mặt lý thuyết nhưng trong thực tế rất khó ápdụng vì sau khi hủy ngẫu nhiên một nút ta có thể chèn lại một số nút khác. Mặc dùnút chèn lại có thể chọn ngẫu nhiên nhưng cây mới không chắc còn ngẫu nhiên.Tuy nhiên thực nghiệm cho thấy rằng sau khi liên tục hủy và chèn các mẫu tinmới, tổng đường đi có xu hướng giảm và do đó số phép so sánh trung bình khi tìmkiếm cũng giảm.

- 32 -

 

2

1 3

4

Page 33: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 33/45

 

4.4 Tần số truy cập:Trong việc tìm kiếm trên cây nhị phân, ta giả sử rằng các khóa đều được

tìm kiếm với cùng xác suất. Tuy nhiên trên thực tế, khóa thứ k được tìm kiếm vớikhóa pk . Khi ấy nếu vẫn giả thiết các khóa được chèn vào theo thứ tự ngẫu nhiênthì do (17), số phép so sánh trung bình để cho một khóa là khóa thứ k được chèn

vào cây là 2H k  – 2. Do đó số phép so sánh trung bình để chèn một khóa vào cây N -1 nút là:

∑ ∑= =

−=− N 

 N 

k k k k  H  p H  p1 1

22)22(

Suy ra số phép so sánh trung bình cho một tìm kiếm thành công trên cây ngẫunhiên N nút là:

∑ −= 12 k k  N  H  pC 

Chẳng hạn nếu phân bố xác suất {pk } thỏa luật Zipf thì số phép so sánh trung bìnhlà:

 N 

 N  N  N 

 H  H  H C 

)2(

1+−=

 Nếu các khóa được chèn vào theo thứ tự ưu tiên giảm dần, số phép so sánh trên chỉ bằng một nữa so với số phép so sánh trung bình nếu các khóa được truy cập vớicùng xác suất, và cũng ít hơn số phép so sánh trung bình của thuật toán tìm kiếmnhị phân.

4.5 Cây cân bằng:Các định lý 4.1 và 4.2 cũng như chú ý 2 ở trên cho thấy với các nút được

chèn và hủy lần lượt một cách ngẫu nhiên thì việc tìm kiếm trên cây nhị phân chỉtốn trung bình O(logN) phép so sánh khóa. Tuy nhiên trong trường hợp xấu nhấtkhi cây bị suy biến thì số phép so sánh trung bình là O(N). Vấn đề được đặt ra làcó thể duy trì được cấu trúc cây sao cho các phép toán sau đây có thể được thựchiện với thời gian O(logN) ngay trong trường hợp xấu nhất.

i) Tìm một phần tử với khóa cho trướcii) Tìm phần tử thứ k  iii) Chèn một phần tử vào vị trí cho trướciv) Hủy một phần tử xác định.

iiii) Chèn một phần tử vào vị trí cho trướciv) Hủy một phần tử xác định .

Dĩ nhiên ta có thể sử dụng một mảng có thứ tự để giải quyết i) và ii) trong

O(logN) đơn vị thời gian. Nhưng khi ấy iii) và iv) sẽ cần O(N) đơn vị thời gian.Trong khi đó nếu các phần tử của mảng được xỏ xâu với nhau theo thứ tự khóa thìiii) và iv) cần O(logN) đơn vị thời gian còn i) và ii) lại cần đến O(N) đơn vị thờigian.

Để giải quyết 4 bài toán trên có hiệu quả tôi sử dụng kiến trúc cây cân bằng. Trong giáo trình này ta chỉ trình bày làm thế nào cấu trúc cây cân bằng giảiquyết i) và iii) trong O(logN) đơn vị thời gian.

- 33 -

Page 34: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 34/45

 

Định nghĩa 4.1 : Một cây nhị phân được nói là cân bằng nếu tại một nút trong bấtkỳ, chiều cao của cây con bên phải và cây con bên trái chỉ khác nhau 1 đơn vị.Ví dụ : Hình vẽ dưới đây là một cây cân bằng với chiều cao 5 và 17 nút con.Ở mỗi nút trong ta sử dụng yếu tố cân bằng có giá trị +, ., - để chỉ hiệu của chiều

cao cây con bên trái và cây con bên phải là +1, 0, hay -1.

.

. -

.

.

-

+

+

. . .

-

13

1

6 7

8 9

10

11 12 14 15 16

.

..

. .

54

3210

A C

B

D

E

F

K

H

G

I

J M

N

P

QOL

Đối với cây cân bằng, điều kiện (1) của hệ quả của định lý 1.6 không còn đúng.Tuy nhiên ta vẫn có :Định lý 4.3 : (Adelson – Velskii, Landis)

Chiều cao của cây cân bằng với N nút trong thỏa(19) ( ) ( )2 2log 1 1.4404 log 2 0.328 N h N  + ≤ < + −

Chứng minh : do định lý 1.6 ta có( )2

log 1 N h+ ≤

Mặt khác để tìm chặn trên của h ta sẽ lật ngược bài toán lại: tìm số nút trong ítnhất trong số các cây cân bằng với chiều cao h cho trước. Gọi Th δmột cây cân

 bằng với chiều cao h và số nút trong Nh ít nhất. Khi một trong hai cây con của nútgốc sẽ có chiều cao là h-1 , giả sử là cây con bên trái. Để cho Nh bé nhất thì câycon bên phải là Th-1 với số nút Nh-1. Ngoài ra cây con bên phải cũng phải có số nút

trong ít nhất và có chiều cao cho phép là h-2 vì Nh-2 < Nh-1. Như thế:

1 21

h h h N N N  − −= + +

Hay(20) ( ) ( ) ( )1 2

1 1 1h h h

 N N N  − −+ = + + +

- 34 -

Page 35: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 35/45

 

 Ngoài ra N1+1=2 và N2+1=3. Như vậy Nh+1 trùng với lời giải duy nhất của (20)với điều kiện đầu tiên là Fh+2 . Suy ra

2

21 2

5

h

h h N F 

+

+

Φ= − > −

Hay ( )2 2

2

1 12 log 2 log 5log 2h N   + < + −  Φ  

 Nghĩa là( )2

1.4404 log 2 0.328h

h N < + −

Ví dụ: Định lý 4.3 cho thấy một tìm kiếm trên cây cân bằng chỉ cần nhiều hơn 25 phép so sánh trong trường hợp số nút nhiều hơn F27-1 = 196.417Vấn đề tiếp theo là khi chèn một nút mới vào cây cân bằng thì cây có thể trở nênmất cân bằng. Chẳng hạn trong cây cân bằng với 17 nút trong ở trên, nếu ta chènthêm một nút mới vào vị trí nút lá số 17 thì cây sẽ trở nên mất cân bằng ở nút gốcF. Để giữ cho cây tiếp tục cân bằng, các tác giả Adelson – Velskii và Landis đã

đưa ra thuật toán xoay cây với thời gian thực hiện là O(logN) cho mỗi lần chèn vàxoay. Khó khăn xảy ra mỗi khi ở một nút có yếu tố cân bằng + (-), phép chèn làmcho chiều cao của cây con bên phải (trái) tăng thêm một đơn vị. Về cơ bản chỉ có 2trường hợp dưới đây với yếu tố cân bằng + và 2 trường hợp tương tự đối xứng với2 trường hợp trên qua trục thẳng đứng khi yếu tố cân bằng là -.

++

+

ß ?

a

h+1

h

h

A

B

++

-

?

d

a

h

h

h

A

B

ß

h-1

XCase 1

Case 2

Trong 2 hình vẽ trên, các hình chữ nhật dài α, β, γ, δ chỉ các cây con với chiều cao

tương ứng. Nếu trường hợp 1 xảy ra, ta xoay cây qua trái , thay A bởi B và A trở thành nútcon trái của B, đồng thời gắn cây con β của B thành cây con phải của A.Mặt khác nếu trường hợp 2 xảy ra ( phép chèn làm cho β hay γ tăng chiều cao lênmột đơn vị, ta sẽ thực hiện phép xoay kép : đầu tiên xoay (X, B) qua phải , sau đóxoay (X, A) sang trái. Trong cả hai trường hợp, sau khi xoay cây có chiều caoh+2 như ban đầu và do đó không ảnh hưởng đến sự cân bằng ở các nút khác nhưhình vẽ sau cho thấy

- 35 -

Page 36: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 36/45

 

.

.

ß

?

a

h+1h

A

B

? da

hh

A B

.

ß

h-1

X

Case 1

Case 2

Trong ví dụ chèn một nút mới ở vị trí nút lá số 17, cây được xoay sang trái ở (F,K) và trở lại cân bằng đồng thời yếu tố cân bằng tại các nút khác đã được cập nhật.

.

.

-

+

+-

.

+

. . +- 13

17

6 7

8 9

10 11 12 14 15 16...

. .

54

3210

A C

B

D

E

F

K

H

G

I

J

M

N

P

QOL

.

18

R

5. Kỹ thuật Hash

5.1 Sử dụng trực tiếp địa chỉ Dĩ nhiên tìm kiếm nhanh nhất là sử dụng trực tiếp địa chỉ của mẫu tin phải tìm(direct access method). Tuy nhiên thường thì ta tìm kiếm theo giá trị của khoá màý nghĩa tự nhiên của nó không liên quan gì đến địa chỉ. Một vấn đề được đặt ra làtìm một hàm h biến đổi mỗi giá trị khoá K thành một địa chỉ h(K). Khi ấy để tìm

mẫu tin có khoá K ta chỉ cần tính toán h(K) rồi đến thẳng địa chỉ đó. Điều lý tưởnglà chọn được hàm h là một đơn ánh từ tập các giá trị khoá đến các địa chỉ 0,1,…,M-1. Tuy nhiên, số đơn ánh từ tập hợp A có N phần tử vào tập hợp B có M phầntử, M(M-1) … (M-N+1) không đáng kể so với số các ánh xạ từ A vào B, M N.Chẳng hạn với A là tập hợp 31 từ tiếng Anh thông dụng nhất và B là tập hợp có 41địa chỉ thì tỷ lệ giữa hai số trên là :

- 36 -

Page 37: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 37/45

 

3141

11....40.41 ≈   50

43

10

10= 710

1

nghĩa là chỉ có 1 đơn ánh trong 10 triệu đơn ánh !Một ví dụ khác cho thấy sự hiếm hoi của đơn ánh là Nghịch lý ngày sinh nhật :trong tập thể với 23 người thì xác suất để 2 người có cùng ngày tháng năm sinh sẽlớn hơn 50%!Thật ra số đơn ánh tuy ít, nhưng cho trước tập hợp A và B với |A| < |B|, ta có thểdò tìm một đơn ánh từ A vào B qua một thủ tục tính toán địa chỉ không mấy khókhăn. Vấn đề nằm ở chỗ ta không biết trước tập hợp A của các khoá mà chỉ biếtđược tập hợp các giá trị khoá có thể có, thường là rất lớn. Chẳng hạn nến khoá làmột chuỗi 20 ký tự trong tập mẫu tự Latin gồm 26 chữ cái thì các giá trị khoá cóthể chọn trong số 2620 giá trị khác nhau, hay 25620 giá trị nếu ta cho các ký tự thuộc

 bộ mã ASCII mở rộng. Như vậy không thể hy vọng chọn ánh xạ h sao cho với N khoá được chọn ngẫunhiên trong số các giá trị trên, các địa chỉ tính được đều đôi một khác nhau. Tóm

lại, ta phải sống chung với các hàm h mà ta gọi là hàm hash không đơn ánh, nghĩalà có thể có 2 giá trị khoá khác nhau k, k’ cùng được “hash” đến một địa chỉ, h(k)= h(k’). Khi ấy ta nói rằng có va chạm địa chỉ.Ta có thể giải quyết va chạm địa chỉ bằng cách xâu tất cả các mẫu tin cùng hashđến một địa chỉ vào một danh sách liên kết tuyến tính. Khi ấy, để tìm một mẫu tincó khoá K cho trước, ta sẽ tính h(K) rồi tìm trong danh sách thứ h(K)+1 mẫu tin cókhoá là K.Vấn đề thật ra không tệ như ta tưởng : thay vì dò tìm trong một danh sách dài với

 N mẫu tin, ta chỉ cần tìm trong một danh sách ngắn với trung bìnhM  

 N mẫu tin như

sẽ được chứng minh dưới đây. Như thế thuật toán sẽ nhanh gấp M lần so với tìmkiếm tuần tự. Tuy nhiên, trên thực tế, các giá trị khoá thưởng tập trung quanh mộtsố giá trị nào đó. Do đó, nếu không khéo chọn hàm hash, sẽ có quá nhiều khoácùng hash đến một địa chỉ làm cho một số danh sách quá dài. Điều này chẳngnhững làm cho việc dò tìm trên các danh sách đó chậm đi mà còn gây khó khăntràn bộ nhớ (overflow).

5.2 Hàm HashĐể giải quyết khó khăn nêu trên, cần chọn hàm hash để phân tán các địa chỉ hashcủa những khoá tập trung quanh một số điểm tụ. Nói cách khác, ta cần chọn hàmhash để có thể giả lập việc chèn ngẫu nhiên các khoá vào theo các địa chỉ hash.

Một hàm thoả mãn được yêu cầu trên và đã được kiểm nghiệm trong thực tế làhàm MOD :h(K) = K ( Mod M)nghĩa là h(K) là dư số trong phép chia có dư K cho M, trong đó giá trị khoá đãđược qui thành một số nguyên. Chẳng hạn với K là chuỗi ký tự bS-1bS-2 ….b0 thì giátrị nguyên tương ứng là : bS-1r

S-1 + bS-2r

S-2 + . . . + b0 

(trong đó r là radix của bộ mã, r = 64, 256, 216 đối với bộ mã 6, 8, 16 bit).

- 37 -

Page 38: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 38/45

 

Để ý rằng nếu M = r K  thì h(K) chỉ phụ thuộc vào K ký tự thấp nhất của K và do đósẽ có rất nhiều va chạm. Tốt nhất nên chọn M là một số nguyên tố sao cho có thểtìm được 2 số nguyên bé K và a để cho :r K = ± a (Mod M)Khi ấy số nguyên tương ứng có thể lấy là số nguyên gồm s chữ số trong hệ đếm

với cơ số a.Ví dụ :Với M = 1009. Ta có thể chọn K = 3, 2 hay 1 tuỳ theo r = 64, 256 hay 216 vì :216 = -49 (mod 1009)Để tránh việc tính toán trên những số nguyên dài, người ta có thể áp dụng lýthuyết trường hữu hạn để tìm ra hàm hash thích hợp. Đối với phương pháp này, tachọn M = 2m và P(x) là một đa thức bậc m thích hợp cho trường có 2 phần tử F2 ={0,1}. Khi ấy nếu khoá K có biểu diễn nhị phân bn-1bn-2…b0 thì ta liên kết với nó đathức bn-1 x n-1 + bn-2 x n-2 + . . . + b0 rồi thực hiện phép chia có dư cho P(x) để được

 phần dư là đa thực bậc bé hơn m :

hm-1xm-1 + hm-2xm-2 + . . . + h0

Giá trị hash h(K) chính là số hm-1, hm-1, ..., h0 trong biểu diễn nhị phân. Nếu khéochọn P(x) ta có thể tránh được sự va chạm của những giá trị khóa gần nhau. Chẳnghạn với m = 15 ta có thể chọn P(x) là đa thức bậc 10:

P(x) = x10 + x8 + x5 + x4 + x2 + x + 1Ta có thể chứng minh rằng nếu k 1 khác k 2 là 2 khóa chỉ sai khác nhau dưới 7 bitthì h(k 1) khác h(k 2).

Một phương pháp để tính địa chỉ hash là dựa vào phép nhân thay vì phép

chia. Giả sử w là một số nguyên đặc biệt( thường là cỡ của một từ máy tính, chẳnghạn w = 2S với S = 8, 16, 32 đối với máy nhị phân). Ta chọn cố định một sốnguyên dương A, nguyên tố cùng nhau đối với w. Khi ấy với mỗi khóa k đã đượcqui ra giá trị nguyyên, ta đặt:

(21) h(k) = M { Ak/w }

trong đó { Ak/w } là phần thập phân của Ak/w. Chẳng hạn với M = 2m (0 < m < s)thì h(k) chính là m bit đầu tiên của s bit thấp nhất của Ak.

Phương pháp này cũng có những đặc tính tốt như phương pháp chia: các chuỗi kítự như { PART1, PART2, PART3 } hay { TYPEA, TYPEB, TYPEC } sẽ đượchash đến các địa chỉ phân biệt cách khá đều nhau h(k), h(k+d), h(k + 2d)...

- 38 -

Page 39: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 39/45

 

5.3 Giải quyết va chạm bằng danh sách liên kết:

Phương pháp đơn giản nhất để giải quyết va chạm. Ta sử dụng M danh sách liên kết. Tasẽ sử dụng một danh sách M phần tử trong đó phần tử thứ i sẽ chứa con trỏ đến phần tửđầu tiên của danh sách thứ i. Bằng cách sử dụng con trỏ NEXT của mỗi phần tử trongdanh sách, ta có thể viếng các phần tử của danh sách để dò tìm khóa K nếu i=h(K). Trongtrường hợp tìm kiếm thất bại ta cũng có thể chèn mẩu tin với khóa K vào cuối danh sách.

Ta hãy xét một ví dụ cụ thể. Trong ví dụ này ta có một danh sách của một số địadanh ở Việt nam. Ta chọn w = 32 với ký tự trống khoảng trống " " có mã số 0 và các chữcái A, B,...., X, Y có mã số từ 1,2,...,23. Ta lấy hằng số A = 1 và M = 5 trong công thức(21). Chính xác hơn nếu K l  chỉ chữ cái đầu tiên của khóa k thì ta định nghĩa:

(22) h(k) = (M K l  ) /w }có tất cả 4 danh sách với các từ thuộc danh sách i ( 0 <= i <= 3) có chữ cái đầu tiên nhưsau:

Danh sách 0: " ", A—E.Danh sách 1: G—M.Danh sách 2: N—T.Danh sách 3: U—Y.

Sau khi 12 mẫu tin dưới đây được chèn vào, ta được 4 danh sách.

Danh sách 0 Danh sách 1 Danh sách 2 Danh sách 3Buôn Mê Thuộc Hà Nội Nha Trang VinhĐiện Biên Phủ Tp Hồ Chí Minh Sơn Tây Yên TửCần Thơ Hải Phòng Quảng NinhĐà Nẵng

Giả sử cần tìm khóa Cần Thơ, công thức (22) cho h(Cần Thơ) = 0 nên ta tình trong Danhsách 0, đến mẫu tin thứ 3 thì tìm kiếm thành công.

Giả sử cần tìm khóa Huế, ta tính h(Huế) = 1 nên tìm trong Danh sách 1, sau khi dò tìmđến mẫu tin cuối cùng với khóa Hải Phòng ta kết luận tìm kiếm thất bại. Khi đó ta có thểchèn mẫu tin với khóa Huế như là mẫu tin thứ 4 của Danh sách 1.

Thuật toán HBegini:=h(K); j:=FIRST[i];

while (j>0) AND (K[j]<>K) doi:=j;j:=NEXT[i];

odEnd

Kết thúc thuật toán H, nếu j>0 thì tìm kiếm thành công và R[j] chính là mẩu tin cókhóa K. Trong trường hợp ngược lại, tìm kiếm thất bại và ta có thể chèn K như một khóa

- 39 -

Page 40: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 40/45

 

mới trong danh sách thứ h(K): nếu j<0 thì mẩu tin mới được trỏ đến bởi FIRST[i], nếukhông, nó được trỏ đến bởi NEXT[i].

Phân tích thuật toán H:

<47-48 chưa có bài gõ>

5.4 Bảng các phần tử rải rác nối kết:Phương pháp này giải quyết khó khăn trên bằng cách hạn chế chiều dài tối đa

của mỗi danh sách. Khi muốn chèn thêm mẩu tin vào một danh sách đã đầy, ta trỏđến một vùng nhớ phụ gọi là vùng tràn (overflow area) sử dụng chung cho cácdanh sách. Có cách khác đơn giản hơn là ta bỏ hẳn vùng tràn: ta sẽ trộn lẫn các

danh sách trong vùng nhớ chính. Chẳng hạn, để tìm khóa K ta có thể dùng địa chỉhash h(K) để so sánh với phần tử đầu tiên của danh sách. Nếu khóa của nó khác K,ta dùng con trỏ NEXT để đến phần tử kế tiếp của danh sách cho đến khi tìm đượckhóa K hoặc con trỏ NEXT bằng 0 (NULL) cho biết đã ở cuối danh sách. Trongtrường hợp thứ hai, việc tìm kiếm đã thất bại và ta có thể tìm một ô trống để chènmẩu tin mới vào và cập nhật lại con trỏ NEXT của phần tử cuối cùng của danhsách cho trỏ đến phần tử mới.

Trong thuật toán này ta sử dụng một bảng có M phần tử để chứa được N mẩutin (M>N). Mỗi phần tử, ngoài vùng khóa và thông tin còn có 1 con trỏ NEXT[i]

(1≤i≤M)- Nếu NEXT[i]=-1: phần tử thứ i còn trống.- Nếu NEXT[i]=0: phần tử thứ i là phần tử cuối cùng của danh sách.- Nếu NEXT[i]>0: con trỏ đến phần tử kế tiếp của danh sách.Để việc tìm kiếm một ô trống chèn mẩu tin mới vào có hiệu quả, ta sử dụng

 biến phụ avail:avail=0: vùng nhớ đã bị tràn, không còn ô trống để chèn.avail>0: thì các ô thứ j €[avail, M] đã chứa đầy, chỉ có thể tìm được ô trống

 j€[0, avail)Ta có thêm hai biến phụ success và overflow để kiểm tra việc tìm kiếm có

thành công không (success=TRUE) và bảng có bị tràn (overflow=TRUE) haykhông.Đầu tiên ta khởi tạo các giá trị: avail=M, success=FALSE, overflow=FALSE, cáccon trỏ NEXT[i] đều là -1.

- 40 -

Page 41: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 41/45

 

<còn thiếu một đoạn nhỏ>

Thuật toán C

Begin

succes:= FALSE;overflow:= FALSE;i:= h(K) + 1;If NEXT[i]<0 then

R[i]:= R;NEXT[i]:=0

ElseWhile (i>0) AND (K[i] <> K) do

p:= i;i:= NEXT[i]

odfiIf i>0 then

success:= TRUE;return i

Elsewhile (avail > 0) AND (NEXT[avail] >= 0) do

avail:= avail – 1odIf avail > 0 then

R[avail]:= R;

NEXT[p-1]:= avail;NEXT[avail]:= 0

Else overflow:= TRUEfi

fiEnd

Phân tích Thuật toán C

 Nhờ sử dụng biến avail, số phép dò tìm ô trống để chèn mẩu tin mới vào là

M+1.Để phân tích số phép dò tìm trung bình cho một tìm kiếm thất bại, '

 N C  , ta

giả sử rằng dãy N giá trị hash h1 = h(K[1]), h2 = h(K[2]), …, h N = h(K[N]) có thểđược chọn ngẫu nhiên trong số M  N  dãy. Trong số đó, gọi α  (k 1 , k 2 , …) là số cácdãy tạo thành k 1 danh sách có chiều dài 1, k 2 danh sách có chiều dài 2, … với k 1 +2k 2 + ... = N  . Cuối cùng , ta giả thiết khoá K cần tìm có thể được hash ngẫu nhiên

- 41 -

Page 42: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 42/45

 

đến 1 trong số M địa chỉ. Khi ấy với 1<= i <= N , xác suất để cần i phép dò tìmcho tìm kiếm thất bại khoá K là:

 N  j

i j M k k 

 j k 

 j, . . .,(..1 21

 N.. .2 kk 21

α 

∑=++

Suy ra:

∑∑=++

≥≤≤

=

 N. . .2 kk

21

1

'

21

, . . .,(1

i j

 j

 N i N  N  k k k 

i

M C  α 

∑ ∑=++

≤≤ ≤+

=

 N. . .2 kk1

211

21

, . . .,(1

 N  j ji

 j N ik k k 

M α   

∑=++

+

+=

 N. . .2 kk j

211

21

, . . .,(2

)1(1k k k 

 j j

M j N α   

∑∑=++

++ +=  j

  j N  N  N    jk k k 

M M S 

 N...2k k 

2111

21

,...),(1 α   

 N 

S  N 

 N  += +1

trong đó ∑=++

=

 N. . .2 kk j

21

21

), . . .,(2

k k k k  j

S   j N  α 

Mặt khác ta có thể kiểm tra dễ dàng ,...),(21 k k α   thoả hệ thức truy chứng:

( ) ( ) ( ) ( ) +−+++−+−= ,...1,11,...,11,...),( 2112121 k k k k k  N M k k  α α α   ( ) ( ) ...1,1,12

3212 +−++ k k k k  α 

Từ đó ta kiểm tra được S N thoả hệ thức truy chứng

- 42 -

Page 43: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 43/45

 

( ) N 

 N  N NM S M S  ++=+ 21

Một lời giải đặc biệt của ( ) có dạng  N  N 

 N  BM  ANM S  +=

( ) ( ) ( ) ( ) 111 1212 −−− −+++−+=+ N  N  N  N  N  M  N  BM M M  N  AM  BM  ANM 

( ) ( ) 012212 =−+−++ AM  B N  A    N  ∀

Suy ra2

1−= A và

4

M  B −=

 Như vậy lời giải tổng quát của ( ) có dạng

( ) N  N  N 

 N NM M M C S 

2

1

4

12

1 −−+= +

Với điều kiện ban đầu 01 =S  ta được

( ) M M M C 2

1

4

120

2 −−+=

Suy ra4

M C =

Vậy ( )( )M 

 N  NM M M M 

M C 

N  N  N 

 N  N  +−−+= ++ 22

4

1 1

1

'

 

 

 

 

 

 +− 

 

  

  +=+ 

 

 

 

 

 −− 

 

  

  +=M 

 N 

M M 

 N 

 N 

 N  N 

212

1

4

121

21

4

1

( )α α  21

4

1 2 +−≈ e

trong đóM 

 N =α  là hệ số đầy của bảng

Chẳng hạn nếu bảng đầy 50% thì số phép dò tìm trung bình vào khoảng 68,04≈

e.

 Ngay cả khi bảng đầy thì số phép dò tìm trung bình cho một tìm kiếm thất bại làkhoảng ( ) 10,21

4

1 2 ≈+e . Mặt khác, tính số phép dò tìm trung bình cho việc tìm

kiếm thành công khoá K, ta giả thiết khoá thứ k,  N k ≤≤0 được chèn vào với xác

suất N 

1. Khi ấy số phép dò tìm trung bình để tìm kiếm thành công một khoá trong

 bảng có N phần tử là:

- 43 -

Page 44: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 44/45

 

∑−

=   

   +=

1

0

'1 N 

k  N M 

k C 

 N C 

∑−

=

  

 

 

 

 ++− 

 

 

 

  +=1

0

421

21

4

1 N 

M  N 

( )M 

 N 

 N 

M  N 

M N 

4

131

221

8

−+ 

  

  

 −− 

  

   +=

( ) α α 

α 

α 

4

321

8

1 2 +−−≈ eC  N 

Chẳng hạn với bảng đầy đủ thì 30,1≈ N C 

5.5 Phương pháp ghi địa chỉ mở Ta có thể bỏ hẳn các con trỏ bằng cách dò tìm tuyến tính sử dụng cách ghiđịa chỉ mở. Các địa chỉ liên tiếp để dò tìm khoá K sẽ được thực hiện lần lượt:

( ) ( ) ( ) 1,...,1,,1,...,1, +−− K hM  M   K h K h

Khi ấy ta chứng minh được rằng số phép dò tìm trung bình cho một tìmkiếm thất bại và thành công một khoá là:

   

  

    

  −

+≈2

'

1

11

2

1

α  N C 

 

 

 

 

 

+≈α 1

11

2

1 N C 

Chẳng hạn với %75=α  thì 5,8' ≈ N C  và 5,2≈ N C 

Tuy nhiên với α  gần bằng 1 thì việc tìm kiếm sẽ rất chậm.

- 44 -

Page 45: Chapter 2 3

5/8/2018 Chapter 2 3 - slidepdf.com

http://slidepdf.com/reader/full/chapter-2-3-559bf427c1a88 45/45

 

- 45 -