CLRS의 d-ary 힙 문제


10

다음 문제를 해결하는 동안 혼란스러워했습니다 (질문 1-3).

질문

D -ary 힙 이진 힙 유사하지만 (하나 개의 가능한 제외) 잎 이외의 노드는이 D 자녀 대신 2 명.

  1. 배열에서 d- ary 힙을 어떻게 표현 하시겠습니까?

  2. nd 측면에서 n 요소 의 d- ary 힙 높이는 얼마입니까?

  3. d -ary max-heap 에서 EXTRACT-MAX를 효율적으로 구현하십시오 . dn의 관점에서 실행 시간을 분석하십시오 .

  4. d -ary max-heap 에서 INSERT를 효율적으로 구현하십시오 . dn의 관점에서 실행 시간을 분석하십시오 .

  5. INCREASE-KEY ( A , i , k )를 효율적으로 구현하여 k <A [i] = k 인 경우 오류를 표시 한 다음 d- ary 행렬 힙 구조를 적절하게 업데이트합니다 . dn의 관점에서 실행 시간을 분석하십시오 .

내 솔루션

  1. 배열 A[a1..an]

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

    내 표기법이 약간 정교 해 보입니다. 더 간단한 것이 있습니까?

  2. 하자 H는 의 높이를 나타내고, D -ary 힙.

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. 이것은 내 구현입니다.

    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) )
    
    • MAX-HEAPIFY의 실행 시간 :

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

    이것이 효율적인 솔루션입니까? 아니면 내 솔루션에 문제가 있습니까?


질문과 설명에 약간의 실수가 있다고 생각합니다. d-ary heap의 높이는 h = (log [nd − n + 1]) − 1 // "-n"이 아니라 "-1"이 아니므로 h = (log [nd−1+1])− 1위의 높이에 대한 설명은 적용되지 않습니다. h = log [nd−1 + 1] −1 = log [nd] -1 = log [n] 그럼에도 불구하고, 트리의 높이는 다음과 같이 기록됩니다. Θ(log(n)).참고 : 로그는 항상 d-ary 힙의 기본 d에 기록됩니다 .
Surabhi Raje 2019

답변:


10
  1. 솔루션은 유효하며 d -ary 힙의 정의를 따릅니다 . 그러나 지적했듯이 표기법은 약간 정교합니다.

    당신의 부모 검색하는 사람들이 개 다음과 같은 기능을 사용할 수 있습니다 내가 번째 요소와 J 의 번째 아이 내가 번째 요소.

    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. CLRS 책은 이미 INSERT 절차를 제공합니다. 이것은 다음과 같습니다

    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. INSERT와 마찬가지로 INCREASE-KEY도 교과서에 다음과 같이 정의됩니다.

    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))


감사! INCREASE-KEY와 INSERT의 구현은 어떻습니까? 나는 그것을 쓰려고 노력하지만 MAX-HEAPIFY의 재귀 호출을 두 번 주었다. 더 나은 해결책이 있습니까? 나는 웹과 위키
lucasKo

나머지 운동입니까? 그렇다면 질문을 업데이트하고 테마에 기꺼이 답변 해 드리겠습니다.
Bartosz Przybylski

그 질문을 편집 된 게시물에 올렸습니다.
lucasKo

INSERT 절차를 다시 구현 하시겠습니까? 새 요소를 삽입 한 후 힙 내에서 순서를 조정하는 프로 시저를 호출 할 필요가 없습니까? 나는 그것을 얻지 못한다 ...
lucasKo

그 설명은 약간 유감 스럽다. 수정을위한 편집을 보라.
Bartosz Przybylski

1

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

-1

두 번째 질문에 대한 답은 h = log d (n (d-1) + 1)-1입니다. 따라서 h = log d (nd-n + 1)-1


4
이것이 왜 대답입니까? 설명이없는 수식은 실제로 누구에게도 도움이되지 않습니다.
David Richerby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.