12

'Algoritma girişten' f-öbek öğreniyorum ve 'azaltma tuşu' işlemi beni gerçekten şaşırtıyor - bu neden bir 'basamaklı kesim' gerektiriyor?Fibonacci yığınlarının neden basamaklı kesmelere ihtiyacı var?

Bu işlem kaldırılırsa:

bütünleme yığın()() eklemek, en az() ve birlik() maliyeti açık değişmez
  • özü-min()
    1. hala O (D (n)), çünkü O (n (H)) 'konsolidasyon' işleminde, en köklü ağaçların maliyeti, kök listesine eklendiğinde ve kalan maliyetler O (D (n))
    2. azalan anahtar(): belli ki O (1)

    D (n) 'ye gelince, tam olarak açıklayamasam da, sanırım hala o (lgn), cak' kesişme-kesim 'olmadan, bir düğüm sadece biraz sonra root listesine taşınmış olabilir ve numaralı herhangi bir düğüm, numaralı babanın altındaki gizler verimliliği etkilemez. En azından bu durum durumu daha da kötüleştirmeyecek. Benim kötü İngilizce :(

    kimse yardımcı olabilir? sayesinde

  • +0

    Harika bir soru. Ebeveynin pozisyonundaki tüm bilgileri atmak çok anlamsız görünüyor. –

    cevap

    6

    basamaklı kesim nedeni D (n) düşük tutmaktır için

    özür dileriz. Bu çıkıyor o size herhangi bir sayıda izin verirse bir ağaçtan kesilecek düğümler, daha sonra D (n) lineer olmak için büyüyebilir, bu da silme ve silme-min'in lineer zaman almasını sağlar.

    Sezgisel olarak, k siparişindeki bir ağaçtaki düğüm sayısını istersiniz. Bu şekilde, konsolide bir yığın içinde sadece logaritma açısından çok fazla ağaç olabilirsiniz.Normal sayıdaki düğümleri kesebilirsiniz. Bir ağaçtan, bu garantiyi kaybedersiniz. Özellikle, k siparişine sahip bir ağaç alabilirsin, sonra bütün torunlarını kesebilirsin. Bu, her biri yapraklar olan k çocuklu bir ağaç bırakır. Sonuç olarak, yalnızca k + 1 toplam düğümleri ile k siparişinde ağaçlar oluşturabilirsiniz. Bu, en kötü durumda, tüm düğümleri tutmak için n - 1 nolu bir ağaca ihtiyacınız olacaktır, bu nedenle D (n), O (log n) yerine n - 1 olur.

    Bu yardımcı olur umarız!

    +0

    Evet, haklısın. Bu yanıltıcı D (n) bir soruna neden olur, ancak bu D (n) çocuk ebeveyni ayıklandığında ortaya çıkmaz (yazmamın nedeni yukarıdadır). Ebeveynleri ebeveynleri ** 'konsolidasyon sırasında' seçerken ortaya çıkıyor ** - yanlış D() dengesizliğe neden oluyor. Şimdi, eğer kesilmiş bir anahtarın azaltılmasından sonra, tüm D (n) 'yi kesik kesilmiş gibi koruyabilirim, yani D() miktarının çocuk miktarından daha küçük olabileceğini düşünün. Ekstrakt-min, hala O (lgn) 'dir. Tam olarak aynı D'yi() korumak zor, ama bence dengeyi korumanın başka bir yolu var: – exprosic

    +0

    her düğümün bir S'si var: başlangıçta, düğümün boyutu. Açıkçası, 2 - ikili notasyonu, 10.000'in katılması. Çocuğu çıkarıldığında ve ** bit sayısı ** ([log2 (S)]) azaldı (1000-> 111, 1011-> 101, vb), farkı ebeveynine bildirir. Fark ebeveynin [log2 (s)] değerini azaltmak için yeterince büyük olduğunda, fark büyükbabaya vb. Olarak bildirilir. – exprosic

    +0

    Aynı nokta, düğümlerin ebeveyni azaltmasını gizlemek, ancak S (veya D) ile gerçek (N ile S) en az S/2 düğümüne sahip olan ağaç arasındaki ilişkiyi O (1) zamanda ve konsolide edin, dengeyi korumak için S/D kullanın (düğümleri aynı D ile birleştirin veya aynı [log2 (S)]). Bu doğru mu? – exprosic