Một vấn đề heap ary từ CLRS


10

Tôi đã bối rối trong khi giải quyết vấn đề sau (câu hỏi 1 trận3).

Câu hỏi

Một d đống -ary giống như một đống nhị phân, nhưng (với một ngoại lệ có thể) các nút lá không có d trẻ em thay vì 2 trẻ em.

  1. Làm thế nào bạn sẽ đại diện cho một d đống -ary trong một mảng?

  2. Chiều cao của một đống d -ary của n phần tử theo nd là bao nhiêu?

  3. Đưa ra một thực hiện có hiệu quả TRÍCH-MAX trong một d -ary max-heap. Phân tích thời gian chạy của nó theo dn .

  4. Đưa ra một thực hiện có hiệu quả INSERT trong một d -ary max-heap. Phân tích thời gian chạy của nó theo dn .

  5. Đưa ra một thực hiện có hiệu quả TĂNG-KEY ( Một , i , k ), trong đó cờ một lỗi nếu k <A [i] = k và sau đó cập nhật d -ary ma trận đống cấu trúc một cách thích hợp. Phân tích thời gian chạy của nó theo dn .

Giải pháp của tôi

  1. Cho một mảng A[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    Ký hiệu của tôi có vẻ hơi phức tạp. Có cái nào đơn giản hơn không?

  2. Hãy h biểu thị chiều cao của d đống -ary.

    Giả sử rằng đống là một hoàn thành d -ary cây

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. Đây là triển khai của tôi:

    EXTRACT-MAX(A)
    1  if A.heapsize < 1
    2      error "heap underflow"
    3  max = A[1]
    4  A[1] = A[A.heapsize]
    5  A.heap-size = A.heap-size - 1
    6  MAX-HEAPIFY(A, 1)
    7  return max
    
    MAX-HEAPIFY(A, i)
    1  assign depthk-children to AUX[1..d]
    2  for k=1 to d
    3      compare A[i] with AUX[k]
    4      if A[i] <= AUX[k]
    5          exchange A[i] with AUX[k]
    6          k = largest
    7  assign AUX[1..d] back to A[depthk-children]
    8  if largest != i
    9      MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
    
    • Thời gian hoạt động của MAX-HEAPIFY:

      TM=d(c8d+(c9+..+c13)d+c14d)
      ci
    • TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    Đây có phải là một giải pháp hiệu quả? Hoặc có điều gì đó sai trong giải pháp của tôi?


Tôi nghĩ rằng có một lỗi nhỏ trong câu hỏi cũng như lời giải thích: Chiều cao của đống d-ary đến h = (log [nd - n + 1]) - 1 // LƯU Ý "-n" của nó và không "-1" và không h = (log [nd−1+1])− 1vì thế chúng tôi giải thích về chiều cao sẽ không đúng. h = log [nd 1 + 1] 1 = log [nd] -1 = log [n] Mặc dù vậy, chiều cao của cây được viết là Θ(log(n)).Lưu ý: log luôn ở gốc d cho một đống d-ary .
Surabhi Raje

Câu trả lời:


10
  1. Giải pháp của bạn là hợp lệ và sau định nghĩa của d đống -ary. Nhưng như bạn đã chỉ ra ký hiệu của bạn là một chút tinh vi.

    Bạn có thể sử dụng hai hàm sau để truy xuất phần tử mẹ của phần tử thứ i và phần tử thứ j của phần tử thứ i .

    d-ary-parent(i)    return (i2)/d+1

    d-ary-child(i,j)    return d(i1)+j+1

    1jdd-ary-parent(d-ary-child(i,j))=i

    dd=2d2

  2. h=logd(nd1+1)1logd(nd)1=logd(n)+logd(d)1=logd(n)+11=logd(n)Θ(logd(n))

    cΘ

  3. AUXd-ary-parentd-ary-child

    EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d1)))

    O(d logd(n(d1)))=O(d(logd(n)+log(d1)))=O(d logd(n)+d logd(d1))

    dndlogd(d1)O(dlogd(n))MAX-HEAPIFYOΘ

  4. Cuốn sách CLRS đã cung cấp thủ tục INSERT. Trông như thế này:

    INSERT(A,key)    A.heap_size=A.heap_size+1    A[A.heap_size]=    INCREASE-KEY(A,A.heap_size,key)

    O(logd(n))

  5. Cũng giống như INSERT, INCREASE-KEY cũng được định nghĩa trong sách giáo khoa là:

    INCREASE-KEY(A,i,key)    if key<A[i]        error"new key is smaller then current"    A[i]=key    while i>1 and A[i]>A[d-ary-parent(i)]        A[i]A[d-ary-parent(i)]        i=d-ary-parent(i)

    O(logd(n))


cảm ơn! Làm thế nào về việc thực hiện INCREASE-KEY và INSERT? Tôi cố gắng viết nó, nhưng nó đã đưa ra hai lần gọi đệ quy MAX-HEAPIFY. Có một giải pháp tốt hơn? Tôi tìm thấy rất ít thông tin trên web và wiki
lucasKo

Đó có phải là phần còn lại của tập thể dục? Nếu vậy xin vui lòng cập nhật câu hỏi của bạn và tôi sẽ vui lòng trả lời chủ đề.
Bartosz Przybylski

Tôi đặt những câu hỏi trên bài chỉnh sửa.
lucasKo

giới thiệu lại thủ tục INSERT? Ý bạn là, nó không phải gọi thủ tục điều chỉnh thứ tự trong heap, sau khi chèn một phần tử mới? Tôi không hiểu ...
lucasKo

Mô tả đó là một chút đáng tiếc, xem chỉnh sửa để làm rõ.
Bartosz Przybylski

1

h=logd[nd1+1]1
1+d+d2+..+dh=ndh+11d1=nh=logd[n(d1)+1]1
h=Θ(logd(n))

-1

Trả lời cho câu hỏi thứ hai là h = log d (n (d - 1) + 1) - 1 Vì vậy, h = log d (nd - n + 1) - 1


4
Tại sao đây là câu trả lời? Một công thức không có lời giải thích không thực sự giúp đỡ bất cứ ai.
David Richerby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.