1. Trang chủ
  2. » Giáo Dục - Đào Tạo

HEAP NHỊ THỨC (GIẢI THUẬT SLIDE) (chữ biến dạng do slide dùng font VNI times, tải về xem bình thường)

34 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 34
Dung lượng 1,27 MB

Nội dung

HEAP NHỊ THỨC Các heap hợp ª ª Heap nhị phân Một heap hợp (mergeable heap) cấu trúc liệu hỗ trợ năm thao tác sau (gọi thao tác heap hợp được) – MAKE-HEAP() tạo trả heap trống – INSERT(H, x) chèn nút x, mà trường key điền, vào heap H – MINIMUM(H) trả trỏ đến nút heap H mà khóa nhỏ – EXTRACT-MIN(H) tách nút có khóa nhỏ khỏi H, trả trỏ đến nút – UNION(H1, H2) tạo trả heap chứa tất nút heaps H1 H2 Các heaps H1 H2 bị hủy thao tác Chương 5: Heap nhị thức Thời gian chạy thao tác lên heaps hợp ª n số nút heap Thủ tục heap nhị phân heap heap nhị thức Fibonacci (worst-case) (worst-case) (khaáu hao) MAKE-HEAP INSERT MINIMUM EXTRACT-MIN UNION DECREASE-KEY DELETE Θ(1) Θ(lg n) Θ(1) Θ(lg n) Θ(n) Θ(lg n) Θ(lg n) Θ(1) Θ(1) O(lg n) Θ(1) O(lg n) Θ(1) Θ(lg n) O(lg n) O(lg n) Θ(1) Θ(lg n) Θ(1) Θ(lg n) O(lg n) Chương 5: Heap nhị thức Heap nhị thức ª Heap nhị thức Hỗ trợ thêm thao tác – DECREASE-KEY(H, x, k) gán vào nút x heap H trị k khóa, k nhỏ hay trị thời khóa – DELETE(H, x) xóa nút x khỏi heap H ª Nhận xét: – Heap nhị thức không hổ trợ thao tác SEARCH hữu hiệu – Do đó, thao tác DECREASE-KEY DELETE cần trỏ đến nút cần xử lý Chương 5: Heap nhị thức Định nghóa nhị thức ª Cây nhị thức Bk với k = 0, 1, 2,… có thứ tự định nghóa đệ quy: – Cây nhị thức B0 gồm nút – Cây nhị thức Bk gồm hai nhị thức Bk − liên kết với theo cách định: ° Nút gốc bên trái nút gốc B0 Bk − Bk − Bk Chương 5: Heap nhị thức Định nghóa nhị thức độ sâu B0 B1 B2 B3 Chương 5: Heap nhị thức B4 Đặc tính nhị thức ª Lemma (Đặc tính nhị thức) Cây nhị thức Bk có tính chất sau: có 2k nút, chiều cao k, k    có nút độ sâu i với i = 0, 1, , k i bậc nút gốc k, lớn bậc nút khác; nút gốc đánh số từ trái sang phải k − 1, k − 2, , 0, nút i gốc Bi k  k!   =  i  i!(k − i )! Chương 5: Heap nhị thức Đặc tính nhị thức Chứng minh Dùng quy nạp theo k Bước bản: dễ dàng thấy tính chất cho B0 Bước quy nạp: giả sử lemma cho Bk − Cây nhị thức Bk gồm hai Bk − nên Bk có 2k − + 2k = 2k nút Do cách liên kết hai nhị thức Bk − với để tạo nên Bk nên độ sâu tối đa nút Bk độ sâu tối đa nút Bk − cộng thêm 1, tức là: (k − 1) + = k −1 Chương 5: Heap nhị thức Đặc tính nhị thức Chứng minh (tiếp) Gọi D(k, i) số nút độ sâu i nhị thức Bk Độ sâu i Độ sâu i − Bk − Bk − D ( k , i ) = D (k − 1, i ) + D (k − 1, i − 1)  k − 1  k − 1  +   =   i   i −1  k  =   i Chương 5: Heap nhị thức Đặc tính nhị thức Chứng minh (tiếp) Sử dụng hình sau B2 B1 B0 Bk − Bk − Bk − Chương 5: Heap nhị thức 10 Hòa nhập hai heap nhị thức ª Thủ tục để hòa nhập (merge) danh sách gốc heap nhị thức H1 danh sách gốc heap nhị thức H2 : BINOMIAL-HEAP-MERGE(H1 , H2 ) – hòa nhập danh sách gốc H1 H2 thành danh sách gốc mà bậc có thứ tự tăng dần – danh sách gốc H1 H2 có tổng cộng m gốc, thời gian chạy thủ tục O(m) Chương 5: Heap nhị thức 20 Hợp hai heap nhị thức ª Thủ tục để hợp hai heap nhị thức: BINOMIAL-HEAP-UNION – hợp hai heap nhị thức H1 H2 trả heap kết BINOMIAL-HEAP-UNION(H1 , H2) H ← MAKE-BINOMIAL-HEAP() head[H] ← BINOMIAL-HEAP-MERGE(H1 , H2) trả lại đối tượng H1 H2 giử lại danh sách mà chúng vào if head[H] = NIL then return H prev-x ← NIL x ← head[H] next-x ← sibling[x] Chương 5: Heap nhị thức 21 while next-x ≠ NIL 10 if (degree[x] ≠ degree[next-x] hay Hợp hai heap nhị (sibling[next-x] ≠ NILthức (tiếp) degree[sibling[next-x]] = degree[x]) 11 then prev-x ← x ∇ Trường hợp 12 x ← next-x ∇ Trường hợp 13 else if key[x] ≤ key [next-x] 14 then sibling[x] ← sibling[next-x] ∇ Trường hợp 15 B INOMIAL-LINK(next-x, x) ∇ Trường hợp 16 else if prev-x = NIL ∇ Trường hợp 17 then head[H] ← next-x ∇ Trường hợp 18 else sibling[prev-x] ← next-x ∇ Trường hợp 19 B INOMIAL-LINK(x, next-x) ∇ Trường hợp 20 x ← next-x ∇ Chương 5: Heap nhị thức Trường hợp 22 Ví dụ thực thi BINOMIAL-HEAP-UNION Chương 5: Heap nhị thức 23 Ví dụ thực thi BINOMIAL-HEAP-UNION (tiếp) Chương 5: Heap nhị thức 24 Các trường hợp xảy BINOMIAL-HEAPUNION Chương 5: Heap nhị thức 25 Phân tích BINOMIAL-HEAP-UNION ª Thời gian chạy BINOMIAL-HEAP-UNION O(lg n), với n số nút tổng cộng heaps H1 H2 Đó – Gọi n1 số nút H1, n2 số nút H2 , ta có n = n1 + n2 – Do H1 chứa tối đa lg n1 + nút gốc, H2 chứa tối đa lg n2 + nút gốc Vậy BINOMIAL-HEAP-MERGE chạy thời gian O(lg n) – H chứa tối đa lg n1 + lg n2 + = O(lg n) nút sau thực thi xong BINOMIAL-HEAP-MERGE Do vòng lặp while lặp tối đa lg n1 + lg n2 + lần, lần lặp tốn O(1) thời gian Chương 5: Heap nhị thức 26 Chèn nút ª Thủ tục để chèn nút vào heap nhị thức: BINOMIAL-HEAP-INSERT – chèn nút x vào heap nhị thức H, giả sử dành chổ cho x khóa x, key[x], điền vào BINOMIAL-HEAP-INSERT(H, x) H’ ← MAKE-BINOMIAL-HEAP() p[x] ← NIL child[x] ← NIL sibling[x] ← NIL degree[x] ← head[H’] ← x H ← BINOMIAL-HEAP-UNION(H, H’) – Thời gian chạy thủ tục O(lg n) Chương 5: Heap nhị thức 27 Tách nút có khóa nhỏ ª Thủ tục để tách nút có khóa nhỏ khỏi heap nhị thức: BINOMIAL-HEAP-EXTRACT-MIN – đem nút có khóa nhỏ khỏi heap nhị thức H trả trỏ đến nút tách BINOMIAL-HEAP-EXTRACT-MIN(H) tìm danh sách gốc H gốc x có khóa đem x khỏi danh sách gốc H H’ ← MAKE-BINOMIAL-HEAP() đảo ngược thứ tự của x danh sa kết chúng, gán vào head[H’] tro danh sách có H ← BINOMIAL-HEAP-UNION(H, H’) return x Chương 5: Heap nhị thức 28 Tách nút có khóa nhỏ (tiếp) – Thời gian chạy thủ tục O(lg n) H có n nút dòng từ đến thực thi thời gian O(lg n) Chương 5: Heap nhị thức 29 Ví dụ thực thi BINOMIAL-HEAP-EXTRACT-MIN Chương 5: Heap nhị thức 30 Giảm khóa ª Thủ tục để giảm khóa nút heap nhị thức thành trị mới: BINOMIAL-HEAP-DECREASE-KEY – giảm khóa nút x heap nhị thức H thành trị k Chương 5: Heap nhị thức 31 Giảm khóa – Tính chất heap-ordered chứa x phải trì! BINOMIAL-HEAP-DECREASE-KEY(H, x, k) if k > key[x] then error “khóa lớn khóa thời” key[x] ← k y ←x z ← p[y] while z ≠ NIL vaø key[y] < key[z] tráo key[y] ↔ key[z] ∇ Nếu y z có thông tin phụ tra y ←z 10 z ← p[y] – Thời gian chạy thủ tục O(lg n): x có độ sâu tối đa lg n nên vòng lặp while (dòng 6-10) lặp tối đa lg n lần Chương 5: Heap nhị thức 32 Ví dụ thực thi BINOMIAL-HEAP-DECREASE-KEY Chương 5: Heap nhị thức 33 Xóa khóa ª Thủ tục để xóa khóa nút x: BINOMIAL-HEAP-DELETE – xóa khóa nút x khỏi heap nhị thức H BINOMIAL-HEAP-DELETE(H, x) BINOMIAL-HEAP-DECREASE-KEY(H, x, −∞) BINOMIAL-HEAP-EXTRACT-MIN(H) – Thời gian chạy thủ tục O(lg n) Chương 5: Heap nhị thức 34 ... Chương 5: Heap nhị thức 13 Biểu diễn heap nhị thức nhị thức “bên trái con, bên phải anh em” Chương 5: Heap nhị thức 14 Biểu diễn heap nhị thức Qui tắc trữ cho nhị thức heap nhị thức: – biểu diễn... có nhiều nhị thức H mà gốc có bậc k Chương 5: Heap nhị thức 12 Tính chất heap nhị thức ª Tính chất Gốc heap nhị thức chứa khóa nhỏ Một heap nhị thức H với n nút gồm nhiều lg n + nhị thức Chứng... 5: Heap nhị thức 20 Hợp hai heap nhị thức ª Thủ tục để hợp hai heap nhị thức: BINOMIAL -HEAP- UNION – hợp hai heap nhị thức H1 H2 trả heap kết BINOMIAL -HEAP- UNION(H1 , H2) H ← MAKE-BINOMIAL -HEAP( )

Ngày đăng: 29/03/2021, 08:23

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w