Cấu trúc của Fibonacci heap

Định nghĩa

Một Fibonacci heap là một tập các cây mà mỗi cây đều là heap-ordered.

Cây trong Fibonacci heap không cần thiết phải là cây nhị thức.

Cây trong Fibonacci heap là có gốc nhưng không có thứ tự (unordered).

 

ppt41 trang | Chia sẻ: Mr Hưng | Lượt xem: 1375 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Cấu trúc của Fibonacci heap, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
14.3.2004Chương 6: Fibonacci Heaps*Cấu trúc của Fibonacci heapĐịnh nghĩa Một Fibonacci heap là một tập các cây mà mỗi cây đều là heap-ordered.Cây trong Fibonacci heap không cần thiết phải là cây nhị thức.Cây trong Fibonacci heap là có gốc nhưng không có thứ tự (unordered).14.3.2004Chương 6: Fibonacci Heaps*Cấu trúc của Fibonacci heap (tiếp)Hiện thực Fibonacci heap trong bộ nhớ:Mỗi nút x có p[x]: con trỏ đến nút cha của nó.child[x]: con trỏ đến một con nào đó trong các con của nó.Các con của x được liên kết với nhau trong một danh sách vòng liên kết kép (circular, doubly linked list), gọi là danh sách các con của x.Mỗi con y trong danh sách các con của x có các con trỏleft[y], right[y] chỉ đến các anh em bên trái và bên phải của y.Nếu y là con duy nhất của x thì left[y] = right[y] = y.14.3.2004Chương 6: Fibonacci Heaps*Cấu trúc của Fibonacci heap (tiếp)Hiện thực Fibonacci heap trong bộ nhớ (tiếp):Các trường khác trong nút xdegree[x]: số các con chứa trong danh sách các con của nút xmark[x]: có trị bool là TRUE hay FALSE,chỉ rằng x có mất một con hay không kể từ lần cuối mà x được làm thành con của một nút khác.14.3.2004Chương 6: Fibonacci Heaps*Cấu trúc của Fibonacci heap (tiếp)Hiện thực Fibonacci heap trong bộ nhớ (tiếp):Fibonacci heap HTruy cập H bằng con trỏ min[H] đến nút gốc của cây chứa khoá nhỏ nhất gọi là nút nhỏ nhất của H.Nếu H là trống thì min[H] = NIL.Tất cả các nút gốc của các cây trong H được liên kết với nhau bỡi các con trỏ left và right của chúng thành một sách liên kết kép vòng gọi là danh sách các gốc của H.n[H]: số các nút hiện có trong H.14.3.2004Chương 6: Fibonacci Heaps*Cấu trúc của Fibonacci heap: ví dụ14.3.2004Chương 6: Fibonacci Heaps*Hàm thế năngDùng phương pháp thế năng để phân tích hiệu suất của các thao tác lên các Fibonacci heap.Cho một Fibonacci heap Hgọi số các cây của Fibonacci heap H là t(H)gọi số các nút x được đánh dấu (mark[x] = TRUE) là m(H).Hàm thế năng của H được định nghĩa như sau(H) = t(H) + 2 m(H)thế năng của một tập các Fibonacci heap là tổng của các Fibonacci heap thành phần.14.3.2004Chương 6: Fibonacci Heaps*Hàm thế năng (tiếp)Khi bắt đầu hàm thế năng có trị là 0, sau đó hàm thế năng có trị  0. Do đó chi phí khấu hao tổng cộng là một cận trên của chi phí thực sự tổng cộng cho dảy các thao tác.14.3.2004Chương 6: Fibonacci Heaps*Bậc tối đaGọi D(n) là cận trên cho bậc lớn nhất của một nút bất kỳ trong một Fibonacci heap có n nút.Sẽ chứng minh: D(n) = O(lg n).14.3.2004Chương 6: Fibonacci Heaps*Các thao tác lên heap hợp nhất đượcNếu chỉ dùng các thao tác lên heap hợp nhất được:MAKE-HEAPINSERTMINIMUMEXTRACT-MINUNIONthì mỗi Fibonacci heap là một tập các cây nhị thức “không thứ tự ”.14.3.2004Chương 6: Fibonacci Heaps*Cây nhị thức không thứ tựMột cây nhị thức không thứ tự (unordered binomial tree) được định nghĩa đệ quy như sauCây nhị thức không thứ tự U0 gồm một nút duy nhất.Một cây nhị thức không thứ tự Uk được tạo bởi hai cây nhị thức không thứ tự Uk - 1 bằng cách lấy gốc của cây này làm con (vị trí trong danh sách các con là tùy ý) của gốc của cây kia.Lemma 19.1 đúng cho các cây nhị thức cũng đúng cho các cây nhị thức không thứ tự, nhưng với thay đổi sau cho tính chất 4:4’. Đối với cây nhị thức không thứ tự Uk , nút gốc có bậc là k, trị k lớn hơn bậc của mọi nút bất kỳ khác. Các con của gốc là gốc của các cây con U0 , U1 ,..., Uk - 1 trong một thứ tự nào đó.14.3.2004Chương 6: Fibonacci Heaps*Tạo một Fibonacci heap mớiThủ tục để tạo một Fibonacci heap trống:MAKE-FIB-HEAPcấp phát và trả về đối tượng Fibonacci heap H, vớin[H] = 0,min[H] = NILPhân tích thủ tục MAKE-FIB-HEAPChi phí thực sự là O(1)Thế năng của Fibonacci heap rỗng là(H) = t(H) + 2 m(H) = 0 .Vậy chi phí khấu hao là O(1).14.3.2004Chương 6: Fibonacci Heaps*Chèn một nút vào Fibonacci heapThủ tục để chèn một nút vào một Fibonacci heap:FIB-HEAP-INSERTchèn nút x (mà key[x] đã được gán trị) vào Fibonacci heap HFIB-HEAP-INSERT(H, x) 1 degree[x]  0 2 p[x]  NIL 3 child[x]  NIL 4 left [x]  x 5 right [x]  x 6 mark [x]  FALSE 7 nối danh sách các gốc chứa x vào danh sách các gốc của H 8 if min[H] = NIL or key[x] key[y ] 9 then tráo x  y10 FIB-HEAP-LINK(H, y, x)11 A[d ]  NIL12 d  d + 113 A[d ]  x14.3.2004Chương 6: Fibonacci Heaps*Củng cố (consolidate)(tiếp)14 min[H ]  NIL15 for i  0 to D(n[H ])16 do if A[i ]  NIL17 then thêm A[i ] vào danh sách các gốc của H18 if min[H ] = NIL or key[A[i ]] key[x]2 then error “khóa mới lớn hơn khóa hiện thời”3 key[x]  k4 y  p[x]5 if y  NIL and key[x] < key[y]6 then CUT(H, x, y)7 CASCADING-CUT(H, y)8 if key[x] < key[min[H]]9 then min[H]  x14.3.2004Chương 6: Fibonacci Heaps*Giảm khóa của một nút (tiếp)Thủ tục phụ để cắt liên kết giữa x và y, cha của nó, sau đó làm x thành một gốc.CUT(H, x, y)1 đem x ra khỏi danh sách các con của y, giảm degree[y]2 thêm x vào danh sách các gốc của H3 p[x]  NIL4 mark[x]  FALSE14.3.2004Chương 6: Fibonacci Heaps*Giảm khóa của một nút (tiếp)Thủ tục phụ để xử lý cha của nút bị cắt dựa trên trường mark[x].CASCADING-CUT(H, y)1 z  p[y]2 if z  NIL3 then if mark[y] = FALSE4 then mark[y]  TRUE5 else CUT(H, y, z)6 CASCADING-CUT(H, z)14.3.2004Chương 6: Fibonacci Heaps*Giảm khoá của một nút: ví dụ(a) Heap ban đầu(b) Giảm khóa 46 thành 15(c)-(e) Giảm khóa 35 thành 514.3.2004Chương 6: Fibonacci Heaps*Chi phí thực sự của FIB-HEAP-DECREASE-KEYGọi H là Fibonacci heap ngay trước khi gọi FIB-HEAP-DECREASE-KEY, số nút của H là n.Chi phí thực sự của FIB-HEAP-DECREASE-KEY bao gồm:O(1): dòng 1-5 và 8-9,thời gian thực thi các cascading cuts. Giả sử CASCADING-CUT được gọi đệ quy c lần. Thời gian thực thi CASCADING-CUT là O(1) không kể các gọi đệ quy.c lần14.3.2004Chương 6: Fibonacci Heaps*Chi phí thực sự của FIB-HEAP-DECREASE-KEY (tiếp)Vậy phí tổn thực sự của FIB-HEAP-DECREASE-KEY là O(c).14.3.2004Chương 6: Fibonacci Heaps*Chi phí khấu hao của FIB-HEAP-DECREASE-KEYGọi H’ là Fibonacci heap sau khi gọi FIB-HEAP-DECREASE-KEY lên H.Nhắc lại: hàm thế năng của H được định nghĩa là(H) = t(H) + 2 m(H)chi phí khấu hao = chi phí thực sự + (H’)  (H)Đã tính: chi phí thực sự của FIB-HEAP-DECREASE-KEY là O(c).Sau khi gọi FIB-HEAP-DECREASE-KEY lên H, thì H’ có t(H) + c cây.(H’)  (H)  (t(H) + c) + 2(m(H)  c + 2)  (t(H) + 2 m(H))  4  c.14.3.2004Chương 6: Fibonacci Heaps*Chi phí khấu hao của FIB-HEAP-DECREASE-KEY(tiếp)Do đó chi phí khấu hao của FIB-HEAP- DECREASE-KEY làO(c) + 4  c = O(1),vì có thể scale up đơn vị của thế năng để khống chế hằng số ẩn trong O(c).từ thế năng14.3.2004Chương 6: Fibonacci Heaps*Xóa một nútThủ tục để xóa một nút:FIB-HEAP-DELETEXóa một nút x khỏi một Fibonacci heap H.FIB-HEAP-DELETE(H, x)1 FIB-HEAP-DECREASE-KEY(H, x, )2 FIB-HEAP -EXTRACT-MIN(H)14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhấtLemma (sách: Lemma 21.1) Cho x là một nút bất kỳ trong một Fibonacci heap, và giả sử degree[x] = k. Gọi y1, y2,..., yk là các con của x được xếp theo thứ tự lúc chúng được liên kết vào x, từ lúc sớm nhất đến lúc trễ nhất. Thì degree[y1]  0 và degree[yi ]  i - 2 với i = 2, 3,..., k....xy1y2yk14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp)Chứng minhRõ ràng là degree[y1]  0.i  2:Khi yi được liên kết vào x thì y1, y2 ,..., yi - 1 là trong tập các con của x nên khi đó degree[x]  i - 1.Nút yi được liên kết vào x chỉ khi nào degree[x] = degree[yi ], vậy khi đó degree[yi ] cũng  i - 1.Kể từ khi đó đến nay, nút yi mất nhiều lắm là một con, vì nếu nó mất hai con thì nó đã bị cắt khỏi x. Vậydegree[yi ]  (i - 1) - 1  i - 2 .14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp)Định nghĩaVới k = 0, 1, 2,... định nghĩa Fk là số Fibonacci thứù k:Lemma (sách: Lemma 21.2, bài tập) Với mọi số nguyên k  0, Lemma (Bài tập 2.2-8) Với mọi số nguyên k  0, ta có Fk + 2  f k , trong đó f = (1 + 5) / 2, tỉ số vàng. 0 nếu k = 0, Fk = 1 nếu k = 1, Fk - 1 + Fk - 2 nếu k  2.14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp)Lemma (sách: Lemma 21.3) Cho x là một nút bất kỳ trong một Fibonacci heap, và cho k = degree[x]. Thì size(x)  Fk + 2  f k , trong đó f = (1 + 5) / 2. Chứng minhGọi sk là trị nhỏ nhất có thể được của size(z) trên mọi nút z mà degree[z] = k.Rõ ràng là s0 = 1, s1 = 2, s2 = 3.Ta có sk  size(x)14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp) Chöùng minh (tieáp)vì sk laø taêng ñôn ñieäu theo k, neân töø degree[yi ]  i - 2 (Lemma 21.1) ta coù . Vaäy...xy1y2yk14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp) Chöùng minh (tieáp)duøng quy naïp theo k ñeå chöùng minh raèng sk  Fk + 2 , vôùi k  0:Böôùc cô baûn: vôùi k = 0 vaø k = 1 laø roõ raøng.Böôùc quy naïp:Giaû thieát quy naïp: k  2 vaø si  Fi + 2 vôùi i = 0, 1,, k - 1. Töø treân ta coù vaäy: size(x)  sk  Fk + 2  f k .14.3.2004Chương 6: Fibonacci Heaps*Chận trên lên bậc lớn nhất (tiếp)Hệ luận Bậc lớn nhất D(n) của nút bất kỳ trong một Fibonacci heap có n nút là O(lg n). Chứng minh Dùng Lemma 21.3.

Các file đính kèm theo tài liệu này:

  • pptphantichthietkegiaithuat_dh_bachkhoa_ch6_9228.ppt
Tài liệu liên quan