53
1 Chương 3 Phân tích độ phức tạp một số giải thuật trên cấu trúc dữ liệu

Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

Embed Size (px)

Citation preview

Page 1: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

1

Chương 3

Phân tích độ phức tạp một số giải thuật trên cấu trúc dữ liệu

Page 2: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

2

Nội dung

1. Tìm kiếm tuần tự trên danh sách liên kết

2. Cây tìm kiếm nhị phân

3. Hàng đợi có độ ưu tiên và heapsort

4. Kỹ thuật băm

Page 3: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

3

1.Tìm kiếm tuần tự trên danh sách liên kết

Tìm kiếm tuần tự (sequential search) có thể được thực hiện thông qua việc dùng danh sách liên kết (linked list) biểu diễn các mẩu tin trong tập tin.

Một lợi điểm: dễ làm cho danh sách liên kết có thứ tự

mà giúp cho việc tìm kiếm nhanh chóng hơn.

Page 4: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

4

3 4 7 21

Z

Tìm kiếm tuần tự trên một danh sách liên kết có thứ tự.

Qui ước: z là nút giả trong danh sách liên kết.

type link = node node = record key, info: integer; next: linkend;var head, t, z: link; i: integer;

Page 5: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

5

Giải thuật tìm kiếm tuần tự trên danh sách liên kết

procedure initialize;begin new(z); z.next: = z; new(head); head.next:= zend;

function listsearch (v: integer; t: link): link;begin z.key: = v; repeat t:= t.next until v < = t.key; if v = t.key then listsearch:= t else listsearch: = zend;

Page 6: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

6

Giải thuật tìm kiếm tuần tự trên danh sách liên kết (tt.)

function listinsert (v: integer; t: link): link; begin z.key: = v; while t.next.key < v do t: = t.next; new(x); x.next: = t.key; t.next: = x; x.key: = v; listinsert: = x;end;

Tính chất: Tìm kiếm tuần tự trên danh sách liên kết có thứ tự dùng trung bình khoảng N/2 thao tác so sánh cho cả sự tìm kiếm thành công hay không thành.

Page 7: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

7

Chứng minh:

Với sự tìm kiếm thành công, nếu giả sử rằng mỗi mẩu tin trong danh sách liên kết có xác xuất bằng nhau (1/N) để được tìm thấy, số lần so sánh trung bình sẽ là:

 (1 + 2+ …+ N)/N = N(N+1)/(2N) = (N+1)/2.

 

Với sự tìm kiếm không thành công, nếu giả sử rằng mỗi mẩu tin trong danh sách liên kết hay nút kết thúc z có xác xuất bằng nhau (1/(N+1))để được tìm thấy ở vị trí sau cùng của quá trình tìm kiếm, số lần so sánh trung bình sẽ là:  

(1 + 2+ …+ (N+1))/(N+1) = (N+2)(N+1)/(2(N+1)) = (N+2)/2.

Page 8: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

8

2.Cây tìm kiếm nhị phân

10

13

7

5

192

Trong một cây tìm kiếm nhị phân (binary search tree),tất cả các mẩu tin với khóa nhỏ hơn khóa tại nút đang xét thì ở cây con bên trái của nút vàcác mẩu tin với khóa lớn hơn hay bằng khóa tại nút đang xét thì ở cây con bên phải của nút.

Page 9: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

9

Khởi tạo cây nhị phân

procedure tree_init;begin new(z); z.1: = z; z.r: = z; new(head); head.key: = 0; head.r: = z;end;

Một cây rỗng được biểu diễn bằng cây có con trỏ bên phải chỉ đến nút giả z.

Page 10: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

10

Tác vụ thêm vàoThêm một nút vào trong cây, ta thực hiện một sự tìm kiếm (không thành công) nút ấy trên cây, rồi gắn nút ấy vào vị trí ứng với nút giả z tại điểm mà quá trình tìm kiếm kết thúc.

A

A R

S

C

E

H

Hình vẽ minh họa việc thêm nút P vào cây nhị phân.

Page 11: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

11

Tác vụ thêm vào (tt.)

;

procedure tree_insert (v: integer; x: link): link;var p: link;begin repeat p: = x; if v < x.key then x: = x.1 else x: = x.r until x = z; new(x); x.key: = v; x.1: = z; x.r: = z; /* create a new node */ if v < p. key then p.1: = x /* p denotes the parent of the new node */ else p.r: = x; tree p.r: = xend

Page 12: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

12

In ra cây nhị phân

procedure treeprint(x: kink)begin if x <> z then begin treeprint (x.1); printnode (x); treeprint (x.r) endend;

Vì một cây nhị phân diễn tả một tập tin có thứ tự, việc in ra các trị khóa trong cây theo một cách đúng đắn sẽ đem lại một danh sách các khóa có thứ tự.

Page 13: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

13

Tác vụ tìm kiếm

type link = node; node = record key, info: integer; l, r: link end;var t, head, z: link;

function treesearch (v: integer, x: link): link; /* search the node with the key v in the binary search tree x */begin while v <> x. key and x <> z do begin if v < x.key then x: = x.1 else x: = x.r end; treesearch: = xend;

Page 14: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

14

Tính chất của sự tìm kiếm trên cây nhị phân

Tính chất: Một tác vụ thêm vào hay tìm kiếm trên một cây nhị phân đòi hỏi chừng 2lnN so sánh trên một cây được tạo ra từ N trị khóa ngẫu nhiên.

Chứng minh:Chiều dài lối đi của 1 nút: là số cạnh cần duyệt qua để từ nút ấy về nút rễ +1.

Đối với mỗi nút trên cây nhị phân, số so sánh được dùng cho một sự tìm kiếm nút ấy thành công chính là chiều dài lối đi của nút ấy.

Tổng tất cả chiều dài lối đi của mọi nút trên cây nhị phân được gọi là chiều dài lối đi của cây nhị phân.

Page 15: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

15

Chứng minh (tt.)

Khi chia chiều dài lối đi toàn cây với N, ta sẽ được số so sánh trung bình đối với một sự tìm kiếm thành công trên cây. Nhưng nếu CN biểu thị chiều dài lối đi trung bình của toàn cây, ta có một hệ thức truy hồi sau đây, với C1 = 1

N

1

(Ck-1 + CN-k)CN = N +

Số hạng N là do sự kiện nút rễ đóng góp 1 vào chiều dài lối đi của mỗi nút.Số hạng thứ hai là do sự kiện khóa tại nút rễ có xác xuất bằng nhau để trở thành phần tử lớn thứ k trong cây, với hai cây con lần lượt chứa k-1 nút và N-k.

Page 16: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

16

Chứng minh (tt.) k

k-1N-k

Hệ thức truy hồi này rất giống hệ thức truy hồi khi phân tích Quicksort, và nó đã được giải cùng một cách để đưa lại cùng một kết quả.Do đó chiều dài trung bình của cây N nút làCN 2N lnN.Suy ra chiều dài trung bình của một nút trong cây là 2lnN. Một tác vụ tìm kiếm hay thêm vào đòi hỏi trung bình 2lnN so sánh trên một cây gồm N nút.

Page 17: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

17

Độ phức tạp trong trưòng hợp xấu nhất

Tính chất: Trong trường hợp xấu nhất, một tác vụ tìm kiếm trên cây nhị phân gồm N khóa có thể cần N so sánh.

Trường hợp xấu nhất xảy ra khi cây nhị phân bị suy biến thành một danh sách liên kết.

Tác vụ xóa

Việc xoá một nút rất dễ nếu nút ấy không có nút con hay chỉ có một nút con.

Để xóa một nút có đủ hai con thì khá phức tạp: ta phải thay thế nó với nút có trị khóa cao nhất kế tiếp (tức nút tận cùng trái của cây con bên phải).

Page 18: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

18

Thí dụ: Tác vụ xoá

E

C

R

H

L

N

M F

A

R

C N

M

A

P

H

L

Page 19: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

19

The following procedure is to delete the node t from the binary tree x.

procedure treedelete (t, x: link);var p, c: link;begin repeat /* search for the node t in the tree */ p: = x; if t.key < z. key then x: = x.1 else x: = x.r until x = t; if t.r = z then /* the node t has no right child */ x: = x.1 /* replace the deleted node with the left child of

t */ else if t.r.1 = then /* the right chile of t has no left child */ begin x: = x.r; x.1: = t.1 end /* replace the deleted node

with its right child */

Page 20: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

20

else begin e: = x.r; while c.1.1 <> z do c: = x.1; /* find the leftmost node of

the right subtree */ x: = c.1; /* x denotes the node that will replace the

deleted one */ c.1 = x.r; /* connect c, the parent of x to the right child of

x */ x.1: = t.1; x.r: = t.r /* connect x: the children of the

deleted node t */ end; if t.key < p.key then p.1: = x /* connect x to the parent of

the deleted node */ else p.r: = x;end;

Page 21: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

21

3. Hàng đợi có độ ưu tiên và giải thuật sắp thứ tự HEAPSORT

Một cấu trúc dữ liệu mà hỗ trợ ít nhất hai tác vụ: + thêm một phần tử mới vào cấu trúc + xóa bỏ phần tử lớn nhất được gọi là hàng đợi có độ ưu tiên (a priority-queue).

Hàng đợi có độ ưu tiên khác với hàng đợi thông thường ở điểm khi lấy phần tử ra khỏi hàng đợi thì đó không phải là phần tử cũ nhất trong hàng đợi mà là phần tử có độ ưu tiên lớn nhất trong hàng đợi.

Page 22: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

22

Hàng đợi có độ ưu tiên (tt.)

Chúng ta muốn xây dựng và duy trì một cấu trúc dữ liệu chứa những mẩu tin có trị khóa số (độ ưu tiên) và có hỗ trợ một số trong những tác vụ sau:- tạo một hàng đợi có thứ tự ưu tiên gồm N phần tử.- thêm (insert ) một phần tử mới vào.- xóa bỏ phần tử lớn nhất ra khỏi hàng đợi.- thay thể phần tử lớn nhất với một phần tử mới

- thay đổi độ ưu tiên của một phần tử.- Xóa bỏ một phần tử bất kỳ nào đó.- Ghép hai hàng đợi có độ ưu tiên thành một hàng đợi có độ ưu tiên lớn hơn.

Page 23: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

23

Thi công hàng đợi có độ ưu tiên

Hàng đợi có độ ưu tiên như đã mô tả là một ví dụ về kiểu dữ liệu trừu tượng đã nói ở chương 1. Có hai cách để thi công hàng đợi có độ ưu tiên:

1. Dùng mảng để thi công hàng đợi có độ ưu tiên (Cách này thì đơn giản khi thêm vào một phần tử mới nhưng khi xóa bỏ phần tử có độ ưu tiên lớn nhất ra khỏi hàng đợi thì độ phức tạp sẽ cao.)

2. Dùng cấu trúc dữ liệu heap.

Page 24: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

24

Cấu trúc dữ liệu heap

Cấu trúc dữ liệu mà có thể hỗ trợ cho các tác vụ làm việc với hàng đợi có độ ưu tiên sẽ chứa các mẩu tin trong một mảng sao cho:

mỗi khóa phải lớn hơn khóa ở hai vị trí khác trong mảng. Tương tự mỗi khóa trong hai khóa này phải lớn hơn hai trị khóa khác và cứ như thế..

Thứ tự này sẽ dễ thấy hơn khi ta diễn tả mảng như một cấu trúc cây với những đường nối mỗi khóa xuống hai khóa nhỏ hơn.

Các trị khóa trong cấu trúc cây thỏa điều kiện heap như sau: Khóa tại mỗi nút cần phải lớn hơn (hay bằng) các khóa ở

hai con của nó (nếu có). Điều này hàm ý rằng trị khóa lớn nhất ở nút rễ.

Page 25: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

25

Thí dụ: Heap dưới dạng cây nhị phân

X

T O

G

A

SM

R AE

N

I

Page 26: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

26

Heap dưới dạng một mảng

Ta có thể diễn tả dạng cây của heap thành một mảng bằng cách đặt nút rễ tại vị trí 1 của mảng, các con của nó tại vị trí 2 và 3, các nút ở các mức kế tiếp ở các vị trí 4, 5, 6 và 7, v.v..

k 1 2 3 4 5 6 7 8 9 10 11 12a[k] X T O G S M N A E R A I

Từ một nút dễ dàng để đi tới nút cha và các nút con của nó.

Cha một nút ở vị trí j sẽ là nút ở vị trí j div 2. Hai con của một nút ở vị trí j sẽ ở các vị trí 2j và 2j+1.

Page 27: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

27

Các lối đi trên heap

Một heap là một cây nhị phân, được diễn tả như là một mảng trong đó mỗi nút thỏa mãn điều kiện heap. Đặc biệt, phần tử có khóa lớn nhất luôn ở vị trí thứ nhất của mảng.

Tất cả các giải thuật làm việc trên heap đi dọc theo một lối đi nào đó từ nút rễ xuống mức đáy (bottom) của heap. Trong một heap có N nút, tất cả các lối đi (path) thường có lgN nút trên đó.

Page 28: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

28

Các giải thuật trên Heap

Có hai tác vụ quan trọng làm việc trên heap: thêm vào phần tử mới và xóa bỏ phần tử lớn nhất ra khỏi heap.

Tác vụ này sẽ làm tăng kích thước của heap lên thêm một phần tử. N được tăng thêm 1. Và phần tử mới được đặt vào tại vị trí a[N], nhưng lúc đó điều kiện heap có thể sẽ bị vi phạm.

Nếu điều kiện heap bị vi phạm, nó sẽ được khắc phục bằng cách hoán đổi phần tử mới với cha của nó. Điều này lại có thể gây ra vi phạm điều kiện heap và nó sẽ được khắc phục tiếp với cùng một cách tương tự.

1. Tác vụ thêm vào (insert)

Page 29: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

29

Tác vụ thêm vào

procedure upheap(k:integer)var v: integer;begin

v :=a[k]; a[0]:= maxint;while a[k div 2] <= v dobegin a[k]:= a[k div 2 ]; k:=k div 2 end;

a[k]:= vend;procedure insert(v:integer);begin

N:= N+1; a[N] := v ; unheap(N)end;

Page 30: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

30

Thêm (P) vào heap

X

T P

G

A

SO

R AE

N

I M

Page 31: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

31

Tác vụ xóa bỏ phần tử lớn nhất

Tác vụ xóa sẽ làm giảm kích thước của heap một đơn vị, tức nó làm giảm N một đơn vị.

Nhưng phần tử lớn nhất (tức a[1]) sẽ được xóa bỏ và được thay thể bằng phần tử mà đã ở vị trí a[N]. Nếu trị khóa tại nút rễ quá nhỏ, nó phải được di chuyển xuống để thỏa mãn điều kiện heap.

Thủ tục downheap thực hiện việc di chuyển phần tử đang ở nút rễ xuống bằng cách hoán đổi nút ở vị trí k với nút lớn hơn trong hai nút con của nó, nếu cần và dừng lại khi nút ở k lớn hơn hai nút con của nó.

Page 32: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

32

Tác vụ xóa bỏ

procedure downheap(k: integer);label 0 ;var j, v : integer;begin v:= a[k]; while k<= N div 2 do begin j:= 2*k; if j < N then if a[j] < a[j+1] then

j:=j+1; if v >= a[j] then go to 0; a[k]:= a[j]; k:= j; end;0: a[k]: =vend;

function remove: integer;begin remove := a[1]; a[1] := a[N]; N := N-1; downheap(1);end;

Page 33: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

33

Thí dụ về tác vụ xóa

T

S P

G

A

RO

C AE

N

I M

Trước khi xóa

Page 34: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

34

Sau khi xóa

S

R P

G

A

MO

C AE

N

I

Page 35: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

35

Tính chất của các tác vụ trên heap

Tính chất 3.1: Mọi tác vụ thêm vào, xóa bỏ, downheap, upheap dòi hỏi ít hơn 2lgN so sánh khi thực hiện trên một heap gồm N phần tử.

Tất cả những tác vụ này phải đi dọc theo một lối đi giữa nút rễ cho đến cuối heap mà bao gồm ít hơn lgN phần tử với một heap gồm N phần tử.

Thừa số 2 là do tác vụ downheap mà cần hai thao tác so sánh trong vòng lặp trong và các thao tác khác chỉ đòi hỏi lgN lần so sánh.

Page 36: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

36

Giải thuật heapsort

Ý tưởng: Giải thuật bao gồm 2 công tác (1) tạo một heap chứa những phần tử cần sắp thứ tự và (2) lần lượt lấy chúng ra khỏi heap theo một thứ tự. M : kích thước của heap N: số phần tử cần được sắp thứ tự.

N:=0;for k:= 1 to M do insert(a[k]); /* construct the heap */for k:= M downto 1 do a[k]:= remove; /*putting the element removed into the array a */

Page 37: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

37

Sắp thứ tự dãy số 5, 3, 1, 9, 8, 2, 11 bằng heapsort

11

8 9

3 5 1 2

5

3 1

9

5

3

1

9

8

3

1

5

9

8

3

2

5 1

Page 38: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

38

9

8

3

2

5 1 11

8

5

3

2

1

5

3

1

2

3

1 2

2

1

1

9 11

8 9 11

5 8 9

11

3

5 8

9 11

2 3

5 8 9 11

Page 39: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

39

Độ phức tạp của heap sort

Tính chất: Heapsort dùng ít hơn 3MlgM lần so sánh để sắp thứ tự M phần tử.

Giới hạn trên này xuất phát từ giải thuật heapsort và tính chất của hai tác vụ thêm vào/xóa bỏ trên heap.Vòng for thứ nhất tốn MlgM lần so sánh.Vòng for thứ hai tốn 2MlgM lần so sánh.Tổng cọng:

MlgM + 2MlgM = 3MlgM

Page 40: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

40

4.Kỹ thuật băm

Kỹ thuật băm (Hashing) là một phương pháp để tìm kiếm các mẩu tin trong một bảng bằng các biến đổi các trị khóa thành những địa chỉ (vị trí) trong bảng.

Bước đầu là tạo một hàm băm (hash function ) mà chuyển đổi khóa tìm kiếm thành một địa chỉ trong bảng.

Một cách lý tưởng, những trị khóa khác nhau nên ánh xạ thành những địa chỉ khác nhau, nhưng không có hàm băm nào là hoàn hảo và do đó hai hay nhiều khóa khác nhau có thể băm thành cùng một vị trí bảng.

Bước kế tiếp là quá trình giải quyết đụng độ (collision-resolution) mà đối phó với trường hợp hai hay nhiều khóa khác nhau có thể băm thành cùng một vị trí bảng.

Page 41: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

41

Hàm băm

Hàm băm là hàm biến thể các trị khóa thành những số nguyên trong tầm [0 .. M-1], với M là số mục tin mà có thể được chứa trong một số lượng ô nhớ có sẵn.

Một hàm băm lý tưởng là hàm băm mà - dễ tính toán - gần giống như một hàm “ngẫu nhiêm”.

Một phương pháp thông thường nhất để băm là cho M là một số nguyên tố và với mỗi trị khóa k, ta tính h(k): = k mod M

Đấy là một phương pháp trực tiếp mà dễ tính và rải khá đều các trị khóa ra trên bảng băm.

Page 42: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

42

Ví dụKích thước bảng băm = 101. Giả sử mỗi trị khóa gồm 4 ký tự. Nếu khóa (“AKEY”) được mã hóa thành một mã gồm 5 bit, ta có thể coi khóa ấy là một tràng số nhị phần như sau:

00001 01011 00101 11001 1 × 323 + 11 x 322 + 5 x 321 + 25 x 320

Mà tương đương với trị số thập phân 44217 .Vì, 44217 mod 101 = 80, như vậy khóa “AKEY” ánh xạ thành 80.

Tại sao kích thước M của bảng băm cần phải là số nguyên tố? Lý do là vì chúng ta muốn tất cả mọi ký tự trong khóa đều tham gia vào việc chuyển đổi (băm) thành vị trí.

Trong thí dụ trên, nếu M = 32, hàm băm của bất kỳ khóa nào cũng chỉ băm mỗi ký tự sau cùng!

Page 43: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

43

Băm một khóa dài

Nếu khóa là một dòng ký tự khá dài thì chúng ta vẫn có thể tính bằng một hàm băm mà biến đổi khóa từng ký tự một. Kỹ thuật đó thể hiện bằng giải thuật lặp như sau:

h:= key[1];for j:= 2 to key_size do begin h:= ((h*32) + key[j]) mod M; /*25 is 32, used for 5-bit code */end;

Page 44: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

44

Phương pháp giải quyết đụng độ: Xâu riêng (Separate chaining)Trong kỹ thuật băm, chúng ta phải quyết định dùng cách nào để giải quyết vấn để hai khóa khác nhau băm thành cùng một giá trị địa chỉ.

Một phương pháp đơn giản nhất: tạo cho mỗi vị trí trong bảng băm một danh sách liên kết (xâu riêng) để xâu tất cả những trị khóa mà băm vào cùng vị trí đó.Khi các trị khóa được xâu trên danh sách liên kết, chúng nên được sắp cho có thứ tự.

type link = node; node = record key, info: integer; next: link end;var heads: array [0..M] of link; t, x: link;

Page 45: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

45

Xâu riêng (tt.)

Danh sách liên kết cho từng vị trí trong bảng băm được khởi tạo như giải thuật sau:

procedure initialize;var i: integer;begin new (z); z.next: = z; for i: = 0 to M-1 do begin new (heads [i]); heads [i].next: = z end;end;

Trong hình vẽ sau trình bày việc đưa vào bảng băm một dãy các ký tự chữ.

Page 46: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

46

Key: A S E A R C H I N G E X A M P L EHash: 1 8 5 1 7 3 8 9 3 7 5 2 1 2 5 1 5

A

A

A

L

M

X

C

N E

E

E

P

G

R

H

S

I

0 1 2 3 4 5 6 7 8 9 10

Page 47: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

47

Độ phức tạp của kỹ thuật băm dùng xâu riêng

Tính chất. Kỹ thuật băm dùng xâu riêng trung bình làm giảm số lần so sánh một hệ số M so với tìm kiếm tuần tự, và cần chỗ bộ nhớ cho M con trỏ để liên kết.

 

Chứng minh:

Nếu N, số khóa có trên bảng băm, lớn hơn nhiều so với M, thì chiều dài trung bình của các xâu riêng là xấp xỉ N/M. Do đó số lần so sánh cho việc tìm kiếm tuần tự trên xâu riêng trong trường hợp trung bình là (N/M)/2.

Page 48: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

48

Phương pháp giải quyết đụng độ: Dò tuyến tính

Phương pháp xâu riêng có thể áp dụng trong trường hợp M < N (M: kích thước bảng băm, N: số trị khóa có thể có)

Có một số phương pháp để lưu N mẩu tin trong bảng băm có kích thước M mà M > N, nhờ vào những vị trí trống trong bảng băm để giải quyết đụng độ. Những phương pháp như vậy được gọi là kỹ thuật băm địa chỉ mở (open addressing hashing).

 Phương pháp địa chỉ mở đơn giản nhất là phương pháp dò tuyến tính ( linear probing): mỗi khi có đụng độ thì dò đến vị trí kế tiếp trong bảng băm, tức là so sánh trị khóa cần tìm với trị khóa tại mẩu tin.

 

Page 49: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

49

Dò tuyến tính (tt.)

Có ba kết quả có thể có của sự thăm dò: -      Nếu hai trị khóa khớp nhau thì sự tìm kiếm kết thúc thành

công. -     Nếu không thấy có mẩu tin tại vị trí, thì sự tìm kiếm kết thúc

thất bại. -  Ngược lại, dò tìm tại vị trí kế tiếp, tiếp tục như thế cho đến khi

tìm thấy trị khóa khớp nhau hoặc là một vị trí rỗng.

Page 50: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

50

Giải thuật dò tuyến tínhprocedure hash_initialize;var i: integer;begin for i: = 0 to M do a[i].key:= maxint; /* maxint means an empty position */end;

function hash_search(v: integer): integer;var x: integer;begin x: = h(v); while a[x].key <> maxit and a[x].key <> v do x: = (x+1) mod M; if a[x].key: = v then hash_search: = x else hash_search: = M;end;

Page 51: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

51

Dò tuyến tính (tt.)

function hash_insert (v: integer): integer;var x: intergerbegin x:= h(v); while a[x].key <> maxint do /* collision */ x: = (x+1) mod M; a[x].key: = v; hash-insert: = x;end;

Hình vẽ sau trình bày việc đưa vào bảng băm một dãy các ký tự chữ: A S E A R C H I N G E X A M P L E

Page 52: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

52

Key: A S E A R C H I N G E X A M P L EHash: 1 0 5 1 18 3 8 9 14 7 5 5 1 13 16 12 5

S

A

A

C

A

E

E

G

H

I

X

E

L

M

N

P

R

Page 53: Chapter3 Phan tich do phuc tap cua mot so giai thuat tren cau truc du lieu

53

Tính chất của dò tuyến tính

Kích thước bảng băm dùng cho kỹ thuật dò tuyến tính thường lớn hơn bảng băm dùng xâu riêng, vì ta phải có M > N, nhưng tổng chỗ bộ nhớ sẽ ít hơn vì không cần lưu các con trỏ.

Tính chất. Dò tuyến tính sử dụng trung bình ít hơn 5 bước dò đối với một bảng băm đầy dưới 2/3.  

Công thức chính xác về số lần dò trung bình cần cho một sự tìm kiếm không thành công là:

½ + 1/(2*(1-)2) với = N/M

Nếu = 2/3, ta được kết quả 5 bước dò.