Creazione di un albero binario autoordinante


20

Ho un compito in cui devo usare un albero di ricerca binario e modificarlo per auto-ordinarsi in modo tale che gli elementi a cui si accede di più (hanno una priorità più alta) siano nella parte superiore dell'albero, la radice essendo il nodo più accessibile .

Il professore mi ha dato il BST e la struttura del nodo con cui lavorare, ma cercare di aggirare l'algoritmo per aggiornare l'albero mentre le cose vengono inserite mi confonde.

So che mentre l'inserimento sta avvenendo, controlla se i dati del nodo corrente sono minori o maggiori del nodo corrente, quindi ricorsivamente va nella direzione corretta fino a quando non trova un puntatore nullo e si inserisce lì. e dopo che è stato inserito aumenta la priorità di 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
}

Ora ho bisogno di capire quando il nodo è uguale, come riordinare l'albero in modo che il nodo corrente (che è uguale a un nodo già esistente) trova il nodo esistente, aumenta la priorità di quel nodo, quindi lo sposta su se il root ha una priorità inferiore.

Penso di avere l'idea che la logica AVL avrebbe funzionato, e quando avrebbe avuto luogo uno spostamento, sarebbe stata una singola rotazione a destra o una singola rotazione a sinistra.

Ecco dove sono confuso, non so davvero da dove iniziare con la creazione di un algoritmo per risolvere il problema. Poiché l'algoritmo AVL funziona tenendo traccia dell'equilibrio di un albero, quindi ruotando i nodi a sinistra oa destra di conseguenza, questo albero non deve preoccuparsi di essere bilanciato, solo che i nodi con la massima priorità non hanno figli con una priorità più alta .

Risposte:


12

Solo due puntatori:

  1. Se vuoi effettivamente combinare le idee di code prioritarie e alberi di ricerca binari, pensa a combinare heap e BST in una struttura.
  2. C'è il concetto di elenchi auto-organizzati . L'idea è di spostare l'elemento a cui è stato recentemente effettuato l'accesso (o verso il fronte) per accelerare gli accessi futuri allo stesso elemento, "imparando" così la distribuzione degli elementi nel tempo (con qualità che dipende dalla particolare implementazione). Forse puoi adattare questo agli alberi?

Spoiler: segui i link seguenti solo se non sei stato in grado di inventare qualcosa da solo.

1. Questo è chiamato un treap .
2. Gli alberi Splay implementano questa idea.


2

Dai un'occhiata agli alberi splay, sono davvero ciò di cui hai bisogno. Dovresti modificare la funzione splay, non per spostare ciascun nodo a pieno accesso all'albero, ma lentamente verso l'alto


2
Perché avrebbe dovuto avere per fare questo cambiamento? Entrambe le strategie sono praticabili e ce ne sono altre. Inoltre, questa è / era una domanda a casa, quindi i suggerimenti sono preferiti alle soluzioni (non commentate). Infine, questa risposta è ridondante così com'è; forse puoi cambiarlo per guidare l'OP verso la soluzione proposta?
Raffaello

Bene, un paio di suggerimenti per te allora: 1. Dai un'occhiata alla funzione splay e vedi cosa fa, leggi la domanda e scopri, in base a ciò che dice, se modifichi o meno la funzione splay. E no, non tutte le strategie sono praticabili poiché ha determinati requisiti da soddisfare in base alla priorità, quindi passare sempre in primo piano non è valido 2. Soluzione non commentata? Come è la mia risposta e la soluzione non commentata? 3. "Ridondante com'è" ... Non vedo come la tua risposta, oops, scusa - i suggerimenti sono definitivi e la mia "soluzione non commentata" porta in primo piano le
annotazioni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.