Tworzenie samoorganizującego się drzewa binarnego

20

Mam zadanie, w którym muszę skorzystać z drzewa wyszukiwania binarnego i zmienić je, aby samo uporządkować się tak, aby elementy, do których najczęściej uzyskiwano dostęp (mają wyższy priorytet), znajdowały się na szczycie drzewa, przy czym węzeł główny był najczęściej dostępnym węzłem .

Profesor dał mi BST i strukturę węzłów do pracy, ale próba obejścia algorytmu aktualizacji drzewa podczas wstawiania rzeczy mnie dezorientuje.

Wiem, że podczas wstawiania sprawdza, czy dane bieżącego węzła są mniejsze lub większe niż bieżący węzeł, a następnie rekurencyjnie idzie we właściwym kierunku, aż znajdzie wskaźnik zerowy i wstawi się tam. a po włożeniu zwiększa priorytet o 1.

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
}

Teraz muszę dowiedzieć się, kiedy węzeł jest równy, jak zmienić kolejność drzewa, aby obecny węzeł (który jest równy już istniejącemu węzłowi) znalazł istniejący węzeł, zwiększył priorytet tego węzła, a następnie przesunął go w górę, jeśli root ma niższy priorytet.

Myślę, że mam pomysł, że logika AVL będzie działać, a kiedy nastąpi zmiana, będzie to pojedynczy obrót w prawo lub pojedynczy obrót w lewo.

Tutaj jestem zdezorientowany, tak naprawdę nie wiem od czego zacząć od stworzenia algorytmu, aby rozwiązać problem. Ponieważ algorytm AVL działa w celu śledzenia bilansu drzewa, a następnie odpowiednio obracania węzłów w lewo lub w prawo, drzewo to nie musi się martwić o zrównoważenie, tylko że węzły o najwyższym priorytecie nie mają dzieci o wyższym priorytecie .

OghmaOsiris
źródło

Odpowiedzi:

12

Tylko dwa wskaźniki:

  1. Jeśli chcesz połączyć idee kolejek priorytetowych i drzew wyszukiwania binarnego, pomyśl o połączeniu sterty i BST w jednej strukturze.
  2. Istnieje koncepcja samoorganizujących się list . Chodzi o to, aby przenieść ostatnio uzyskiwany element na przód (lub w kierunku), aby przyspieszyć przyszłe dostępy do tego samego elementu, tym samym „ucząc się” rozkładu elementu w czasie (z jakością zależną od konkretnej implementacji). Może możesz to dostosować do drzew?

Spojler: skorzystaj z poniższych linków tylko wtedy, gdy sam nie byłeś w stanie coś wymyślić.

1. Nazywa się to pułapką .
2. Splay drzewa wdrażają ten pomysł.

Raphael
źródło
2

Spójrz na drzewa splay, są naprawdę tym, czego potrzebujesz. Będziesz musiał zmodyfikować funkcję splay, aby nie przenosić każdego dostępnego węzła aż do drzewa, ale powoli w górę

Bober02
źródło
2
Dlaczego miałby mieć do tej zmiany? Każda strategia jest wykonalna , a istnieją inne. Poza tym, to było / było pytanie o pracę domową, więc wskazówki są preferowane (niekomentowane) rozwiązania. Wreszcie odpowiedź ta jest zbędna; może możesz to zmienić, aby poprowadzić PO w kierunku proponowanego rozwiązania?
Raphael
Cóż, kilka wskazówek dla ciebie: 1. Spójrz na funkcję splay i zobacz, co robi, przeczytaj pytanie i wymyśl, na podstawie tego, co mówi, czy zmodyfikujesz funkcję splay, czy nie. I nie, nie wszystkie strategie są wykonalne, ponieważ ma on pewne wymagania do spełnienia w oparciu o priorytet, więc przesuwanie się do przodu przez cały czas jest nieważne. 2. Niezakomentowane rozwiązanie? Jaka jest moja odpowiedź i nieskomentowane rozwiązanie? 3. „Nadmiarowe, jakie jest” ... nie rozumiem, jak odpowiedź, niestety, wskazówki są ostateczne, a moje „nieskomentowane rozwiązanie” zwraca uwagę na stół
Bober02