Tập hợp trong thiết kế thuật toán
Chơng Tập hợp Tập hợp cấu trúc toán học Trong thiết kế thuật toán, thờng xuyên phải sử dụng đến mô hình liệu tập hợp Trong chơng nghiên cứu mô hình liệu tập hợp, phơng pháp cài đặt tập hợp Sau nghiên cứu số kiểu liệu trừu tợng, từ điển hàng u tiên, đợc xây dựng dựa khái niệm tập hợp, nhng quan tâm đến số phép toán 5.1 Tập hợp phép toán tập hợp Chúng ta xem rằng, độc giả đà làm quen với tập hợp Do trình bày ngắn gọn số khái niệm đợc sử dụng đến sau Trong toán học, có hai phơng pháp để xác định tập hợp A Đơn giản liệt kê tất phần tử tập A (nếu tập A hữu hạn) Chẳng hạn, A = {1, 2, 3} có nghĩa A tập hợp gồm phần tử 1, 2, Cách khác, ta xác định tập A cách nêu lên đặc trng cho ta biết xác đối tợng có phần tử tập A hay không Ví dụ, A = {x| x số nguyên chẵn} Ta cần quan tâm đến tập đặc biệt : tập trống , tập hợp không chứa phần tử Với hai tập A, B đối tợng x bất kỳ, ta có quan hệ sau đây: tập A x A (x thuộc A), quan hệ x phần tử A B (A tập B), quan hệ phần tử tập A phần tư cđa tËp B A = B nÕu vµ chØ A B B A Các phép toán tập hợp Các phép toán tập hợp hợp, giao, hiệu Cho hai tập A B, hợp A B, A B , tập hợp gồm tất phần tử thuộc A thuộc B Còn giao cđa A vµ B lµ tËp A ∩ B gồm tất phần tử vừa thuộc A, vừa thuộc B Hiệu A-B tập hợp gồm tất phần tử thuộc A nhng không thuộc B Chẳng hạn, A = {1, 2, 3, 4} B = { 3, 4, 5} th× A ∪ B = {1, 2, 3, 4, 5}, cßn A ∩ B = {3, 4} A-B = {1, 2} 122 Tích đê-cac hai tập hợp A B tập hợp A x B gồm tất cặp phần tử (a, b), a A b B Chẳng hạn, A = {1, 2}, B = {a, b, c} th× A x B = {(1, a), (1, b), (1, c), (2, a), (2, b), (2, c)} Quan hệ nhị nguyên tập hợp Khi xét tập hợp, nhiều trờng hợp ta cần quan tâm đến quan hệ phần tử tập hợp Một quan hệ nhị nguyên (gọi tắt quan hệ) R tập A tập tích đê-cac A x A, tức R A x A Nếu a, b phần tử tập A (a, b) R ta nãi a cã quan hƯ R víi b vµ ký hiƯu lµ aRb VÝ dơ : A = {a, b, c} vµ R = {(a, a), (a, c), (b, a), (c, b)}, ®ã a cã quan hƯ R víi c (a,c) R b quan hệ R với c cặp (b, c) R Mét quan hƯ R cã thĨ cã c¸c tÝnh chÊt sau : - Quan hƯ R trªn tËp A cã tính phản xạ, aRa, với a A - Quan hệ R có tính đối xứng, cã aRb th× cịng cã bRa - Quan hƯ R có tính bắc cầu, có aRb bRc có aRc - Quan hệ R có tính phản đối xứng, có aRb a b bRa Ví dụ A tập số nguyên Z R quan hệ nhỏ ( nil begin Bp : = B; found : = false; while (Bp < > nil) and (not found) if Bp ^ element + Ap ^ element then found : = true else Bp : = Bp^.next; if found then begin new (Cp); Cp ^ element : = Ap ^ element; 128 Cp ^ next : = C; C : = Cp end; Ap : = Ap ^ next end end; Để tìm hợp A B, ta chép danh sách B để có danh sách C B Sau ta so sánh phần tử e danh sách A với phần tử danh sách B Nếu phần tử B e ta thêm e vào danh sách C Một cách tơng tự phép toán A-B Trong cách cài đặt tập hợp danh sách (không đợc sắp) nh trên, thực phép toán hợp, giao, trừ, ta phải so sánh phần tử danh sách A với phần tử danh sách B Do thời gian thực phép toán 0(n2), n = max (| A|, |B|), | A| ký hiệu số phần tử tập A C Cài đặt tập hợp danh sách đợc : Trong trờng hợp tập hợp tập tập vũ trụ đợc tuyến tính quan hệ thứ tự đó, phép toán tập hợp đợc thực nhanh ta cài đặt tập danh sách đợc Một tập đợc biểu diễn danh sách đợc sắp, thành phần danh sách đợc xếp theo thứ tự tăng dần (hoặc giảm dần) : a1 < a2 < < an Chó ý : thay cho viƯc xét phần tử tập hợp, ta có thĨ xÐt c¸c kho¸ cđa chóng NÕu tËp c¸c kho¸ tập đợc tuyến tính ta cài đặt tập hợp danh sách đợc theo khoá Với danh sách đợc A B, để tìm danh sách đợc C biểu diễn hợp, giao, hiệu chúng, ta cần so sánh phần tử a danh sách A với phần tử danh sách B tìm đợc danh sách B phần tử a, tìm đợc phần tử b > a Hơn nữa, phần tử danh sách A, ta đà tìm đợc phần tử bk danh s¸ch B cho ≤ bk, phần tử ai+1 danh sách A ta cần bắt đầu tìm kiếm danh sách B kể từ thành phần bk Do thời gian thực phép toán hợp, giao, trõ sÏ tû lƯ víi sè phÇn tư cđa tËp hợp, O(n), n = max (| A|, | B|) Sau viết thủ tục thực phép hợp giao tập hợp đợc biểu diễn danh sách đợc A B Danh sách đợc 129 C biểu diễn hợp (hoặc giao) danh sách vòng tròn, trỏ C trỏ tới cuối danh sách, C^.next trỏ tới đầu danh sách procedure Union (A,B : pointer ; var C: pointer ); var Ap , Bp , Cp : pointer ; procedure Add ( Cp : pointer ; var C: pointer); {Thêm Cp vào cuối danh sách C } begin if C=nil then begin C:=Cp; C^.next :=C end else begin Cp^.next :=C^.next; C^.next := Cp; C:=Cp end end; begin C:= nil; Ap:=A; Bp:=B; while ( Apnil) and (Bp nil) if Ap^.element < = Bp^.element then begin new(Cp); Cp^.element:=Ap^.element Add(Cp,C); if Ap^.element=Bp^.element then begin 130 Ap := Ap^.next ; Bp := Bp^.next end else Ap:=Ap^.next end else begin new(Cp); Cp^.element:=Bp^.element Add(Cp,C); Bp:=Bp^.next end; while Ap < > nil begin new(Cp); Cp^.element:=Ap^.element; Add (Cp,C); while Bp < > nil begin new (Cp); C ^ element : Bp ^ element ; Add (Cp, C) end; end; procedure Intersection(A,B : pointer; var C: pointer); var Ap, Bp, Cp : pointer; begin C:=nil; Ap:=A; Bp:=B; while ( Ap< > nil ) and (Bp< > nil) 131 begin Sum : = 0; for i = to 10 Sum : = Sum + ord(x[i]); h : = Sum mod N end; Trong hàm băm trên, ta đà chuyển đổi xâu kí tự thành số nguyên cách lÊy tỉng sè cđa c¸c m· sè cđa tõng kÝ tự xâu (ord (c) mà số kí tự c) Cấu trúc liệu bảng băm mở đợc minh hoạ hình 5.1 l N-1 T Hình 5.1 Bảng băm mở 135 Chúng ta khai báo cấu trúc liệu bảng băm mở biĨu diƠn tõ ®iĨn nh sau : const N= type pointer = ^ element; .; element = record key : keytype; next : pointer end; Dictionary = array [0 N-1] of pointer; var T : Dictionary; ViƯc khëi t¹o mét từ điển rỗng đợc thực lệnh sau for i : = to N-1 T [i] : = nil; Các phép toán từ điển bảng băm mở Sau đa thủ tục thực phép toán từ điển function var Member (x : keytype; var T : Dictionary) : boolean; P : pointer; found : boolean; begin P : = T [h(x)]; found : = false; while (P < > nil) and (not found) if P ^ key = x then found : = true else P : = P ^ next; Member : = found end; procedure Insert (x : keytype; var T : Dictionary); var i : N-1; P : pointer; 136 begin if not Member (x, T) then begin i : = h (x); new (P); P ^ key : = x; P ^ next : = T [i]; T[i] : = P end end; procedure Delete (x : keytype; var T : dictionary); var i : N-1; P, Q : pointer; found : boolean; begin i : = h (x); found : = false; if T[i] < > nil then if T [i] ^ key = x then begin { lo¹i x khái danh s¸ch} T [i] : = T [i] ^ next; found : = true end else begin {xem xÐt c¸c thành phần danh sách} Q : = T [i]; P : = Q ^ next; while (P < > nil) and (not found) if P ^ key = x then begin { lo¹i x khái danh s¸ch } Q ^ next : = P ^ next; found : = true 137 end else begin Q : = P; P : = Q ^ next; end; end; end; 5.4.2 Bảng băm đóng : Trong bảng băm mở, thành phần T [i] bảng lu giữ trỏ trỏ tới danh sách phần tử tập hợp đợc đa vào lớp thứ i (i = 0, , N-1) Khác với bảng băm mở, bảng băm đóng, phần tử tập đợc lu giữ thành phần T [i] mảng Do ta khai báo kiểu liệu từ điển đợc cài đặt bảng băm đóng nh sau : type Dictionary = array [o N-1] of keytype KeyType kiểu liệu khoá phần tử từ điển Nhớ lại rằng, hàm băm h : K {0, 1, , N-1} ánh xạ từ tập hợp khoá K vào tập hợp số 0, 1, , N-1 mảng Đây ánh xạ nhiều-vào-một, nên xẩy số khóa khác đợc ánh xạ vào số Do có trờng hợp, ta muốn đặt khoá x vào thành phần i = h (x) mảng, nhng đà lu giữ khoá khác Hoàn cảnh đợc gọi va chạm (collision) Vấn đề đặt giải va chạm nh Sự va chạm đợc giải cách băm lại (rehashing) Chiến lợc băm lại nh sau ta lần lợt xét vị trí h1 (x), h2 (x), tìm đợc vị trí trống để đặt x vào Nếu không tìm đợc vị trí trống bảng đà đầy ta đa x vào bảng đợc hi (x) (i = 1, 2, ) giá trị băm lại lần thứ i, phụ thuộc vào khoá x Sau xét số phơng pháp băm lại Các phơng pháp băm lại Băm lại tuyến tính Đây phơng pháp băm lại đơn giản Các hàm hi (x) đợc xác định nh sau : 138 hi (x) = (h (x) + i) mod N Tøc lµ, ta xem mảng mảng vòng tròn lần lợt xem xét vị trí h (x) + 1, h (x) + 2, Chẳng hạn, N = 10 c¸c kho¸ a, b, c, d, e cã c¸c gi¸ trị băm nh sau h (a) = 7, h(b) = 1, h (c) = 4, h (d) = 3, h (e) = b d 23 c e a Hình 5.2 Giả sử ban đầu bảng rỗng, tức tất thành phần bảng chứa giá trị empty khác với tất giá trị khoá Giả sử ta muốn đa vào bảng rỗng lần lợt giá trị khoá a, b, c, d, e Khi a, b, c, d lần lợt đợc đặt vào vị trí 7, 1, 4, vào bảng Vì h(e) = 3, ta tìm đến thành phần thứ mảng thấy đà chứa d Tìm đến thành phần h1 (e) = h (e) + = 4, lại thấy đà chứa c Tìm đến thành phần h2 (e) = 5, vị trí rỗng, ta đa e vào Kết ta có bảng băm đóng đợc minh hoạ hình 5.2 Hạn chế phơng pháp băm lại tuyến tính giá trị khoá đợc xếp liền vào sau giá trị khoá ban đầu đà đa vào bảng mà không gặp va chạm Do ngày giá trị khóa bảng tụ lại thành đoạn dài bị lấp đầy đoạn bị lấp đầy khoảng trống Và vậy, việc tìm vị trí trống bảng để đa giá trị vào, sau chậm Băm lại bình phơng Phơng pháp băm lại tốt hơn, cho phép ta tránh đợc tích tụ bảng giá trị xung quanh giá trị đa vào bảng ban đầu, sử dụng hàm băm lại đợc xác định nh sau : h i (x) = (h (x) + i2) mod N; Hạn chế phơng pháp chỗ, giá trị băm lại không lấy đầy tất số mảng Do cần đa vào bảng giá trị mới, ta không tìm đợc vị trí rỗng, bảng hÃy vị trí rỗng Xét trờng hợp chiều mảng N số nguyên tè Gi¶ sư víi i ≠ j ta cã h i (x) = h j (x) hay h (x) + i2 ≡ h (x) + j2 (mod N) Do ®ã (i - j) (i +j) ≡ (mod N) 139 Vì N số nguyên tố, ta suy ra, hai nhân thức i -j i + j phải chia hết cho N Do i N/2 j N/2 Từ ta suy ra, víi i ®i tõ ®Õn N div tÊt giá trị băm lại khác Nh có tất N div giá trị băm lại khác Tức là, gặp va chạm, phơng pháp băm lại bình phơng cho phép tìm đến nửa số vị trí bảng Việc tìm đến nửa số vị trí bảng để tìm vị trí trống, thực tế, cần đến, trừ trờng hợp bảng đà gần đầy Trong phơng pháp băm lại trên, thực chất ta đà thêm vào giá trị băm ban đầu h (x) gia số (i) để nhận đợc giá trị băm lại lần thứ i h i (x) = (h (x) + (i)) mod N Trong trờng hợp băm lại tuyến tính (i) = i, trờng hợp băm lại bình phơng (i) = i2 Còn sử dụng hàm gia số khác để nhận đợc giá trị băm lại Chẳng hạn, (i) = c i, ®ã c h»ng sè > h i (x) = (h (x) + c i) mod N VÝ dơ, víi N = 8, c= h (x) = 4, vị trí bảng đợc tìm đến 4, 7, 2, 5, 0, 3, Tất nhiên, N c có ớc chung lớn 1, phơng pháp băm lại không cho ta tìm đến tất vị trí bảng; chẳng hạn với N = c = Một cách tiếp cận khác sử dụng gia số số ngẫu nhiên : h i (x) = (h (x) + di) mod N đó, d1, d2, d N-1 hoán vị ngẫu nhiên số 1, 2, N-1 Cần lu ý rằng, đà chọn dÃy ngẫu nhiên d1, d2, d N-1, phép toán tìm kiếm, xen vào loại bỏ, gặp va chạm, ta phải sử dụng dÃy ngẫu nhiên đà chọn để tính giá trị băm lại Các phép toán từ điển bảng băm đóng Sau xét phép toán từ điển (Insert, Delete, Member) từ điển đợc cài đặt bảng băm đóng Để biết bảng có chứa khoá x hay không, ta phải " thăm dò" lần lợt vị trí h (x), h1 (x), h2 (x) Giả sử ta cha thực phép loại bỏ bảng Khi có hai khả Hoặc tìm đợc vị trí bảng chứa x, tìm đợc vị trí trống hk (x) Trong trêng hỵp thø hai, ta cã thĨ kết luận rằng, bảng không chứa x, x đợc đặt vào vị trí hk+1 (x), hk+2 (x), nhiên tình hình khác, bảng đà thực số lần loại bỏ Trong trờng hợp đà có loại bỏ bảng, tìm vị trí trống hk (x) ta đảm bảo x không 140 vị trí h k+1 (x), h k+2 (x), Vì lúc đa x bảng, vị trí hk (x) đà đầy, nhng sau trở thành trống phép loại bỏ Để đảm bảo rằng, tìm vị trí trống h k (x), ta tin bảng không chứa x, ta đa vào "bị loại bỏ" (deleted) khác với "trống" (empty) Với việc đa vào deleted, cần loại bỏ giá trị khỏi vị trí bảng, ta cần thay giá trị bảng vị trí deleted Khi cần đa giá trị vào bảng, ta đặt vào vị trí đà loại bỏ Ta khai báo cấu trúc liệu bảng băm ®ãng biĨu diƠn tõ ®iĨn nh sau : const N = ; empty = ; deleted = ; {empty vµ deleted lµ hai h»ng khác với tất giá trị khoá phần tử từ điển} type Dictionary = array [ N-1] of keytype; var T : Dictionary; Với giá trị khoá x, để thực phép toán Insert, Delete, Member, ta phải xác định vị trí bảng có chứa x, vị trí bảng cần đặt x vào T tởng để tìm vị trí thăm dò lần lợt vị trí h (x), h1 (x), h2 (x), Điều đợc thực thủ tục Location Sau ta mô tả thủ tục Location trờng hợp sử dụng phơng pháp băm lại tuyến tính Với giá trị khoá x, thủ tục cho phép thăm dò vị trí bảng, xuất phát từ vị trí đợc xác định giá trị băm h (x), lần lợt qua vị trí h1 (x), h2 (x), tìm đợc vị trí có chứa x, tìm vị trí trống Quá trình thăm dò dừng lại qua toàn bảng mà không thành công (không tìm thấy vị trí chứa x không tìm thấy vị trí trống) Vị trí mà trình thăm dò dừng lại đợc ghi vào tham biến k Ta đa vào thủ tục tham biến j để ghi lại vị trí loại bỏ (deleted) vị trí trống mà trình thăm dò phát ra, bảng có vị trí nh procedure Location (x : keytype; var k, j : integer); var i : integer; {biến i ghi lại giá trị băm h (x)} begin 141 i : = h (x); j : = i; if (T [i] = x) or (T [i] = empty) then k:=i else begin k = (i + 1) mod N; while (k < > i) and ( T [k] < > x) and (T [k] < > empty) begin if (T [k] = deleted) and (T [j] < > deleted) then j : = k; k : = (k +1) mod N end; if (T [k] = empty) and (T [j] < > deleted) then j : = k end; end; Sau ta mô tả thủ tục hàm thực phép toán từ điển function Member (x : keytype; var T : Dictionary) : boolean; var k, j : integer; begin Location (x, k, j) if T [k] = x then Member : = true else Member : = false end; procedure Insert (x : keytype; var T : Dictionary); var k, j : integer; 142 begin Location (x, k, j); if T [k] < > x then if (T [j] = deleted) or (T[j] = empty) then T [j] := x else writeln (' bảng đầy') else writeln (' bảng đà có x') end; procedure var Delete (x : keytype; var T : Dictionary); k, j : integer; begin Location (x, k, j); if T [k] = x then T [k] : = deleted; end; 5.5 Phân tích đánh giá phơng pháp băm Bảng băm cấu trúc liệu thích hợp để biểu diễn từ điển kiểu liệu trừu tợng khác đợc xây dựng khái niệm tập hợp Trong mục so sánh u điểm hạn chế hai phơng pháp băm mở băm đóng Chúng ta phân tích đánh giá hiệu phơng pháp Trong bảng băm mở, thành phần T[i] bảng chứa trỏ trỏ tới danh sách liên kết phần tử tập hợp thuộc lớp thứ i Do không gian cần thiết để biểu diễn tập hợp bảng băm mở không gian cần để lu ghi biểu diễn phần tử tập hợp cộng thêm không gian giành cho trỏ (mỗi trỏ đòi hỏi từ máy) Trong ghi biểu diễn phần tử tập hợp đợc lu giữ bảng băm đóng Do đó, với bảng băm đóng không gian nhớ cố định đợc giành để biểu diễn tập hợp Bảng chứa số vị trí rỗng (càng nhiều vị trí rỗng hạn chế va chạm tránh đợc tợng đầy tràn) Nh vậy, ghi có cỡ lớn (không gian nhớ cần cho ghi lớn), ta sử dụng bảng băm đóng lÃng phí không gian đáng kể Một u điểm khác bảng băm mở không cần phải đặt vấn đề giải va chạm, phần tử thuộc lớp đợc tổ chức dới dạng danh sách liên kết 143 Sau đánh giá thời gian trung bình cần để thực phép toán từ điển bảng băm Bảng băm mở : Gi¶ sư cã N rỉ T [0], T [1], , T [N-1] có M phần tử đợc lu giữ bảng Giả sử rằng, hàm băm phân phối phần tử vào rổ Do trung bình rổ chứa M/N phần tử Vì thời gian trung bình để thực phép toán từ điển Insert, Delete vµ Member lµ (M/N) NÕu ta chän N = M thời gian trung bình cho phép toán Insert, Delete Member trở thành số Cần lu ý rằng, ta đà đánh giá thời gian trung bình để thực phép toán từ điển với giả thiết hàm băm phân phối phần tử cho rổ Trên thực tế, giả thiết khó đợc thực trờng hợp xấu nhất, tất phần tử đợc đa vào rổ, thời gian trung bình cho phép toán tỉ lệ với cỡ tập hợp nh trờng hợp danh sách Bảng băm đóng : Sau tiến hành đánh giá thời gian trung bình để thực phép toán từ điển bảng băm đóng ta sử dụng phơng pháp xác suất để đánh giá Giả sử rằng, hàm băm h phân phối phần tử tập hợp số bảng Giả sử ta cần phải đa phần tử vào bảng T có chiều N bảng đà chứa k phần tử Khi xác suất để lần đầu ta tìm đợc vị trí trống N k ta gọi xác suất p1, xác suất kiện N cần lần thăm dò để đa phần tử vào bảng Xác suất p2 kiện cần hai lần thăm dò để đa phần tử vào bảng xác suất lần thăm dò thứ gặp va chạm với xác suất lần thăm dò thứ hai tìm đợc vị trí trống tức : p2 = k N N − k N Một cách tuần tự, ta tính đợc xác suất pi kiện cần i lần thăm dò để đa phần tử vào bảng Nh ta cã : 144 − p = NN k N−k N −1 k k −1 n − k p3 = N N − N − , k p2 = N k pi = N k −1 k−i+2 N−k N −1 N − i + N − i +1 CÇn lu ý rằng, để đa phần tử vào bảng đà chứa k phần tử đòi hỏi nhiều k + lần thăm dò Từ công thức tính giá trị trung bình (phơng sai) đại lợng ngẫu nhiên, ta tính đợc số trung bình lần thăm dò để đa phần tử vào bảng đà chứa k phÇn tư k +1 E k = ∑i p = i i =1 N +1 N − k +1 Ta có nhận xét rằng, số lần thăm dò cần để tìm kiếm phần tử bảng số lần thăm dò để đa vào bảng Giả sử bảng có chiều N chứa M phần tử Khi số trung bình lần thăm dò cần để tìm kiếm phần tử bảng : E= M M E k = k =0 N +1 M M −1 ∑ k =0 N − k +1 = N +1 1 + + + M N N − M +2 N +1 = N +1 M ®ã, (H H N N +1 = 1+ − H ) N − M +1 1 + + hàm điều hoà N Giá trị gần hàm điều hoà đợc cho công thức : H N = ln N + γ ®ã < ε < + 1 − + −ε N 12 N 120N , cßn ϒ = 0, 5772156649 252 N 145 số Ơle Do ta cã thÓ xem HN ≈ ln N + γ VËy E= N +1 [ ln ( N + 1) − ln ( N − M + 1)] M M §Ỉt N + = α , ta cã E= N +1 N − M +1 1 ln = − ln = − ln (1 − α ) α N − M +1 α N +1 α Sè đợc gọi hệ số đầy, gần tỉ số số phần tử có bảng chiều bảng Với = có nghĩa bảng trống, = N có nghĩa bảng đà đầy Công thức : N +1 E = ln (1 − α ) α cho phÐp ta tính đợc số trung bình E lần thăm dò cần thiết để tìm kiếm, xen vào bảng phần tử, theo hệ số đầy bảng Giá trị E tơng ứng đợc cho bảng sau : α E 0,1 0,25 0,5 0,75 0,9 0,95 1,05 1,15 1,39 1,55 2,56 3,15 Nhìn vào bảng ta thấy, bảng băm đóng phơng pháp có hiệu để cài đặt từ điển (tập hợp với phép toán tìm kiếm, xen vào loại bỏ), nh nhiều kiểu liệu trừu tợng khác Ngay bảng đà đầy tới 95%, cần gần lần thăm dò tìm đợc phần tử cần tìm bảng, tìm đợc vị trí trống để đa phần tử vào bảng Hạn chế bảng băm đóng không gian nhớ giành để lu giữ phần tử tập hợp bị cố định Vì muốn vừa để tiết kiệm không gian nhớ vừa để tránh đầy tràn, ta cần phải đánh giá để lựa chọn chiều bảng cho thích hợp 146 5.6 Hàng u tiên Trong mục xét kiểu liệu trừu tợng hàng u tiên Hàng u tiên tập hợp với hai phép toán Insert DeleteMin Phép toán Insert có ý nghĩa thông thờng : xen phần tử vào tập hợp Ta cần phải xác định phép toán DeleteMin Giả sử Pri hàm u tiên tập hợp A tức Pri ¸nh tõ tõ tËp A vµo mét tËp P nµo ®ã Pri : A → P ®ã P lµ tập đợc thứ tự tuyến tính (thông thờng P tập số nguyên hay tập số thực đó) Với a A, ta gọi Pri (a) giá trị u tiên a Phép toán DeleteMin tập A tìm tập a phần tử a có Pri (a) nhỏ loại khỏi tập A Thuật ngữ : "hàng u tiên" có ý nghĩa nh sau Từ : "hàng" nói lên rằng, phần tử thuộc tập hợp (ngời đối tợng đó) chờ đợi đợc "phục vụ" Từ "u tiên" có nghĩa rằng, phục vụ không đợc tiến hành theo chế độ "ai vào hàng trớc đợc phục vụ trớc" nh hàng đà xét chơng mà phụ thuộc vào mức u tiên đợc xác định phần tử hàng Chúng ta kể nhiều ví dụ hàng u tiên Chẳng hạn, hệ phân chia thời gian thờng có nhiều nhiệm vụ chờ đợi đợc xử lý, có nhiệm vụ cần đợc xử lý trớc nhiệm vụ khác Khi tập hợp nhiệm vụ chờ đợi đợc xử lý lập thành hàng u tiên Trong thực tế, việc mô trình gồm kiện độc lập với thời gian dẫn đến việc xét hàng u tiên Cài đặt hàng u tiên Chúng ta biểu diễn hàng u tiên danh sách đợc không đợc Danh sách cài đặt mảng dới dạng danh sách liên kết Tốt ta biểu diễn hàng u tiên dới dạng danh sách liên kết Nếu danh sách đợc xếp theo thứ tự tăng dần giá trị u tiên phần tử, phần tử cần loại bỏ phép toán DeleteMin phần tử danh sách, cần thời gian không đổi để thực phép toán Song để xen vào danh sách phần tử mới, ta phải tìm vị trí thích hợp để đặt vào , phép toán Insert đòi hỏi phải có thời gian (n), với danh sách có n phần tử Nếu ta cài đặt hàng u tiên danh sách liên kết không đợc sắp, xen phần tử vào hàng, ta cần đa vào đầu danh sách Nhng việc thực phép toán DeleteMin lại chậm Bạn đọc hÃy viết (xem nh tập) thủ tục thực phép toán Insert DeleteMin cách cài đặt hàng u tiên danh sách liên kết đợc không đợc 147 Ta có nhận xét rằng, bảng băm không thích hợp để biểu diễn hàng u tiên Lý là, bảng băm không cho ta cách thuận tiện để tìm phần tử có giá trị u tiên nhỏ Trong phần sau ta đa phơng pháp để biểu diễn hàng u tiên 5.7 Heap cài đặt hàng u tiên heap Heap nhị phân gắn nhÃn với nhÃn giá trị thuộc tập hợp đợc thứ tự tuyến tính, cho điều kiện sau đợc thực Tất mức đầy, trừ mức thấp có thĨ thiÕu mét sè ®Ønh ë møc thÊp nhÊt, tất xuất liên tiếp từ bên trái Giá trị đỉnh không lớn giá trị đỉnh Cần ý rằng, điều kiện không đảm bảo heap tìm kiếm nhị phân Hình 5.3 minh hoạ số nhị phân với giá trị đỉnh số nguyên đợc ghi đỉnh Hình a heap Còn hình b, c, d heap Cây b vi phạm điều kiện 1, hình c vi phạm điều kiện 2, hình d vi phạm điều kiện 11 128 10 10 (a) (b) 148 (c) (d) H×nh 5.3 Chú ý 1) Thuật ngữ heap hoàn toàn khác, không liên quan đến thuật ngữ heap dùng để vùng nhớ động 2) số tác giả gọi heap đợc phận (partially ordered tree) Khi lấy giá trị u tiên làm giá trị đỉnh, ta sử dụng heap để biểu diễn hàng u tiên Sau ta xét xem phép toán hàng u tiên đợc thực heap nh Phép toán Insert Để xen phần tử vào heap, ta thêm liền kề với c¸c l¸ ë møc thÊp nhÊt, nÕu møc thÊp nhÊt cha đầy; mức thấp đầy, ta thêm vào mức cho điều kiện heap đợc bảo tồn Hình 5.4a minh hoạ sau thêm với giá trị u tiên vào heap hình 5.3 a Tất nhiên nhị phân hình 5.4 a nói chung không heap, điều kiện bị vi phạm Nếu sau thêm vào không heap, ta theo đờng từ tới gốc Nếu đỉnh có giá trị u tiên nhỏ đỉnh cha nó, ta trao đổi đỉnh với cha Quá trình đợc minh hoạ hình 5.4 b c Dễ dàng chứng minh đợc rằng, sau trình biến đổi ta cã mét heap (bµi tËp) 11 10 10 12 (a) 149 ... hình liệu tập hợp Trong thiết kế thuật toán, sử dụng tập hợp nh mô hình liệu, phép toán hợp, giao, hiệu, phải cần đến nhiều phép toán khác Sau đa số phép toán quan trọng nhất, phép toán đợc mô... tËp A C Cài đặt tập hợp danh sách đợc : Trong trờng hợp tập hợp tập tập vũ trụ đợc tuyến tính quan hệ thứ tự đó, phép toán tập hợp đợc thực nhanh ta cài đặt tập danh sách đợc Một tập đợc biểu diễn... ®iĨn Trong nhiỊu ¸p dơng, sư dơng mô hình liệu tập hợp để thiết kế thuật toán, ta không cần đến phép toán lấy hợp, giao, hiệu tập Thông thờng đà lu giữ tập hợp thông tin đó, ta cần đến phép toán