CLRS'den d-ary yığın sorunu


10

Aşağıdaki sorunu çözerken kafam karıştı (sorular 1-3).

Soru

Bir d -yığın yığını ikili bir yığın gibidir, ancak (bir olası istisna dışında), yaprak olmayan düğümlerin 2 çocuk yerine d çocukları vardır.

  1. Bir dizideki d -ary yığınını nasıl temsil edersiniz?

  2. Bir d- dizi n elementinin n ve d cinsinden yüksekliği nedir ?

  3. Bir d -ary max-yığınında EXTRACT-MAX'ın etkin bir uygulamasını verin . Çalışma süresini d ve n cinsinden analiz edin .

  4. Bir d -ary max-yığınında INSERT'in etkin bir uygulamasını verin . Çalışma süresini d ve n cinsinden analiz edin .

  5. K <A [i] = k ise bir hata işaretleyen ve sonra d -ary matris yığın yapısını uygun şekilde güncelleyen INCREASE-KEY ( A , i , k ) ' nin etkin bir uygulamasını verin . Çalışma süresini d ve n cinsinden analiz edin .

Çözümüm

  1. A [ a 1 ] dizisi verin . . a n ]A[a1..an]

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

    İşaretim biraz karmaşık görünüyor. Daha basit olan var mı?

  2. Let h yüksekliğini belirtmektedir d -ary yığın.

    Yığının tam bir d- ikili ağaç 1 + d + d 2 + olduğunu varsayalım . . + D h = n

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. Bu benim uygulamam:

    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'nin çalışma süresi:

      burada c i O anlamına gelir maliyetiiinci çizgi yukarıda.

      TM=d(c8d+(c9+..+c13)d+c14d)
      ci
    • ÖZÜ-MAX:

      TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    Bu etkili bir çözüm müdür? Yoksa çözümümde bir sorun mu var?


Bence açıklamada olduğu gibi soruda da küçük bir hata var: D-ary yığınının yüksekliği h = (log [nd - n + 1]) - 1 // NOT onun "-n" değil "-1" ve değil h = (log [nd−1+1])− 1Bu yüzden yükseklik için açıklama yukarıda doğru olmayacaktır. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Yine de ağacın yüksekliği Θ(log(n)).Not olarak yazılır : log, d-ary yığını için her zaman d tabanına .
Surabhi Raje

Yanıtlar:


10
  1. Çözümünüz geçerli ve d -ary yığın tanımını takip ediyor. Ama belirttiğiniz gibi, notasyonunuz biraz sofistike.

    Sen üst öğesini almak için bu iki aşağıdaki işlevleri kullanabilir i -inci elemanı ve j arasında ıncı çocuğun i -inci öğesi.

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

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

    Açıkçası . Bu işlevleri d-ary-parent ( d-ary-child ( i , j ) ) = i olup olmadığını kontrol edebilirsiniz.1jdd-ary-parent(d-ary-child(i,j))=i

    Ayrıca kolay olduğunu görmek için ikili yığın özel tip olmasıdır -ary yığın d = 2 sen yerine eğer, d ile 2 , o zaman onlar fonksiyonları EBEVEYN, SOL maç ve SAĞ kitapta bahsedilen göreceksiniz.dd=2d2

  2. Cevabınızı doğru anlarsam geometrik bir ilerleme kullanırsınız . Senin durumunda , ki bu açıkça log d ( nh=logd(nd1+1)1 , ki bu aslında geçerli ve doğru bir çözümdür. Ancak sadece sabit dalgalanmalarla başa çıkmak için Θ ( log d ( n ) ) yazmak isteyebilirsiniz.logd(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 kitabı zaten INSERT prosedürü sağlıyor. Bu şöyle görünür:

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

    O(logd(n))

  5. Tıpkı INSERT gibi INCREASE-KEY de ders kitabında şu şekilde tanımlanmıştır:

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


Teşekkürler! INCREASE-KEY ve INSERT uygulaması nasıl olur? Yazmaya çalışıyorum, ancak MAX-HEAPIFY'nin iki kez yinelenen çağrısını yaptı. Daha iyi bir çözüm var mı? Web ve wiki
lucasKo

Geri kalan egzersiz mi? Öyleyse lütfen sorunuzu güncelleyin, temayı yanıtlamaktan memnuniyet duyarız.
Bartosz Przybylski

Bu soruyu düzenlenen gönderiye yazdım.
lucasKo

INSERT prosedürünü tekrar mı? Yani, yeni bir eleman ekledikten sonra yığın içindeki sırayı ayarlayan prosedürü çağırmak zorunda değil misiniz?
Anlamadım

Bu açıklama biraz talihsizdi, temizlik için düzenlemelere bakın.
Bartosz Przybylski

1

Bu tam bir cevap değil. bölüm b) çözüm değildir

h=lÖgd[nd-1+1]-1
Onun
1+d+d2+..+dh=ndh+1-1d-1=nh=lÖgd[n(d-1)+1]-1
kullanıcı 55463 tarafından işaret edildiği gibi (çünkü yorum yapamaz, ancak cevap veremez), ancak açıklama eksikliği nedeniyle indirildi. Oylanan cevap aynı zamanda yanlışlıkla çözdü. Cevap hala olacak
h=Θ(günlükd(n))
Kaynak: Sorun 2-2. D-yığın yığınlarının analizi, bölüm b)

-1

İkinci sorunun cevabı h = log d (n (d-1) + 1) - 1 Yani, h = log d (nd - n + 1) - 1


4
Bu neden cevap? Açıklaması olmayan bir formül kimseye gerçekten yardımcı olmaz.
David Richerby
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.