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:a2…a2+d−1level 2:a2+d…a2+d+d2−1⋮level k:a2+∑i=1k−1di…a2+∑i=1kdi−1

    → İş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+1−1d−1=nh=logd[nd−1+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(c8∗d+(c9+..+c13)∗d+c14∗d)
      ci
    • ÖZÜ-MAX:

      TE=(c1+..+c7)+TM≤C∗d∗h=C∗d∗(logd[n(d−1)+1]−1)=O(dlogd[n(d−1)])

    → 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 ⌊(i−2)/d+1⌋

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

    Açıkçası . Bu işlevleri d-ary-parent ( d-ary-child ( i , j ) ) = i olup olmadığını kontrol edebilirsiniz.1≤j≤dd-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(nd−1+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)+1−1=logd⁡(n)Θ(logd⁡(n))

    cΘ

  3. AUXd-ary-parentd-ary-child

    EXTRACT-MAXMAX-HEAPIFYO(d logd⁡(n(d−1)))

    O(d logd⁡(n(d−1)))=O(d(logd⁡(n)+log⁡(d−1)))=O(d logd(n)+d logd⁡(d−1))

    d≪ndlogd⁡(d−1)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.