Kendi Kendine Sıralayan İkili Ağaç Oluşturma


20

Ben bir ikili arama ağacı kullanmak ve kendini en çok erişilen (daha yüksek bir önceliğe sahip) öğeleri ağacın üstünde, kök en çok erişilen düğüm olacak şekilde kendi kendini değiştirmek için gereken bir atama var .

Profesör bana çalışmak için BST ve düğüm yapısını verdi, ancak işler eklenirken ağacı güncellemek için algoritmamın etrafında dolaşmaya çalışmak beni karıştırıyor.

Ekleme olurken, geçerli düğümün verilerinin geçerli düğümden daha az veya daha büyük olup olmadığını denetler, sonra boş bir işaretçi bulana ve kendini oraya ekleyene kadar yinelemeli olarak doğru yönde gider. ve yerleştirildikten sonra önceliği 1 arttırır.

template <class Type>
void BinarySearchTree<Type> ::  insert( const Type & x, BinaryNode<Type> * & t )
{
    if( t == NULL )
        t = new BinaryNode<Type>( x, NULL, NULL );
    else if( x < t->element )
        insert( x, t->left );
    else if( t->element < x )
        insert( x, t->right );
    else
        t->priority++;  // Duplicate; do nothing for right now
}

Şimdi düğüm eşit olduğunda, mevcut düğümün (zaten var olan bir düğüme eşit olan) mevcut düğümü bulması, düğümün önceliğini arttırması için ağacın nasıl yeniden sıralanacağını anlamaya ihtiyacım var. Kök daha düşük bir önceliktir.

Sanırım AVL mantığının işe yarayacağı ve bir vardiya gerçekleşeceği zaman, sağa tek bir dönüş ya da tek bir dönüş olacağını düşünüyorum.

Burada kafam karıştı, sorunu çözmek için bir algoritma oluşturmaya nereden başlayacağımı bilmiyorum. AVL algoritması bir ağacın dengesini takip ederek çalıştığından, düğümleri buna göre sola veya sağa döndürdüğünden, bu ağacın dengelenme konusunda endişelenmesine gerek yoktur, sadece en yüksek önceliğe sahip düğümlerin daha yüksek önceliğe sahip çocukları yoktur. .

Yanıtlar:


12

Sadece iki işaretçi:

  1. Öncelik sıraları ve ikili arama ağaçlarının fikirlerini gerçekten birleştirmek istiyorsanız, yığın ve BST'yi tek bir yapıda birleştirmeyi düşünün.
  2. Kendi kendini düzenleyen listeler kavramı vardır . Fikir, aynı öğeye gelecekteki erişimleri hızlandırmak için yakın zamanda erişilen öğeyi cepheye (veya bu cepheye doğru) taşımaktır, böylece zaman içinde eleman dağılımını "öğrenir" (belirli uygulamaya bağlı kalite ile). Belki bunu ağaçlara uyarlayabilirsin?

Spoiler: Aşağıdaki bağlantıları sadece kendiniz bir şey bulamadıysanız izleyin.

1. Buna tedavi denir .
2. Yayvan ağaçlar bu fikri uygular.


2

Yayvan ağaçlara bir göz atın, gerçekten ihtiyacınız olan şey bunlar. Her bir erişilen düğümü ağaca kadar hareket ettirmek için değil, yavaşça yukarı doğru yayma işlevini değiştirmeniz gerekir.


2
Neden olur sahip bu değişikliği yapmak? Her iki strateji de uygulanabilir ve başkaları da var. Ayrıca, bu bir ödev sorusudur / bu nedenle (önerilmeyen) çözümlere yönelik ipuçları tercih edilir. Son olarak, bu cevap olduğu gibi gereksizdir; belki OP'yi önerilen çözümünüze yönlendirecek şekilde değiştirebilirsiniz?
Raphael

Peki, sizin için birkaç ipucu: 1. Splay fonksiyonuna bir göz atın ve ne yaptığını görün, soruyu okuyun ve splay fonksiyonunu değiştirip değiştirmediğinizi söylediklerine göre anlayın. Ve hayır, önceliğe dayalı olarak karşılamak için belirli gereksinimleri olduğu için tüm stratejiler geçerli değildir, bu nedenle her zaman öne geçmek geçerli değildir 2. Önerilmeyen çözüm? Cevabım ve önerilmeyen çözümüm nasıl? 3. "Olduğu gibi gereksiz" ... Cevabınızın nasıl olduğunu görmüyorum, ayy, üzgünüm - ipuçları nihai ve "
önerilmeyen
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.