Gli alberi binari hanno uno scopo specifico nella memorizzazione di dati gerarchici? Qual è il loro uso canonico?


12

Capisco la struttura degli alberi binari e come attraversarli. Tuttavia, sto lottando per rendermi conto dei loro reali usi, scopi nei programmi e nella programmazione. Quando penso a esempi di "vita reale" di dati gerarchici, quasi sicuramente hanno più di 2 figli. Ad esempio, in un albero genealogico, una madre può avere spesso più di due figli.

Gli "alberi binari" sono davvero utili solo per archiviare dati correlati linearmente a causa dei tempi di elaborazione più rapidi su matrici ed elenchi? In alternativa, servono a uno scopo specifico nella memorizzazione di dati gerarchici? In tal caso, quali esempi ci sono dell'applicazione di alberi binari. Quali dati sono tali che un nodo abbia al massimo 2 figli?


Penso che l'uso principale di un albero binario sia quello di ordinare i dati. https://en.wikipedia.org/wiki/Binary_search_tree
Mandrill

Risposte:


25

No, gli alberi binari non servono per archiviare dati gerarchici nel senso a cui stai pensando. Il caso d'uso principale per gli alberi n-ary, dove nè un numero fisso, è la capacità di ricerca rapida , non una gerarchia semantica.

Ricorda il vecchio gioco in cui una persona pensa a un numero compreso tra 1 e 100 e l'altra deve indovinarlo nel minor numero di ipotesi possibile e, se indovini, la persona che pensa al numero deve dirti se lo sei anche tu alto o troppo basso? Dopo un po 'diventa noioso perché capisci rapidamente che dovresti sempre iniziare da 50, quindi andare a 25 o 75 e continuare a dividere l'intervallo da cercare a metà con ogni nuova ipotesi successiva, e alla fine puoi indovinare qualsiasi numero al massimo in 7 ipotesi, garantite.

Potrebbe non essere un gioco divertente, ma quella proprietà è ciò che rende utili gli alberi binari (e altri n-ary): puoi usarli per cercare un set di dati molto grande in pochissimo tempo.


Ottima risposta grazie mille. Quindi, l'albero binario è davvero solo un'altra struttura per l'archiviazione di dati come faresti in un array o in un elenco, ma con l'ulteriore vantaggio di funzionalità di ricerca rapida?
sw123456,

1
@ sw123456: Esatto. Come in ogni ingegneria, viene fornito con compromessi (utilizza più - e più frammentata - memoria di un array con lo stesso numero di elementi, O (n) accesso all'elemento #n del set di dati piuttosto che O (1) accesso, ecc.), ma la ricerca veloce è sicuramente il principale vantaggio degli alberi binari.
Mason Wheeler,

@ sw123456 Sono contento di poterti spiegare :)
Mason Wheeler,

3
L'accesso agli elementi è O (log (n)) quando l'albero è bilanciato. O (n) sarà il caso peggiore quando è degenerato (la maggior parte dei nodi con una sola parentesi).
Mandrill,

@ sw123456 Il routing di rete utilizza una leggera modifica di un albero binario chiamato Trie (creato per una maggiore efficienza per il dominio problematico). In realtà memorizza le informazioni sulla gerarchia mentre i router attraversano la struttura bit per bit quando cercano un indirizzo IP per trovare la destinazione a cui inoltrare il pacchetto. Gli indirizzi IP sono anche per natura gerarchici, quindi nel percorrere un IP per trovare la corrispondenza del prefisso più lunga, il router sta attraversando la gerarchia IP, gli IP di sottorete, ecc. Non è ovvio semanticamente, ma la relazione è lì. I router utilizzano questa struttura per l'efficienza della ricerca, come ha risposto Mason.
Chris Cirefice,

3

Qualsiasi struttura ad albero, in cui un nodo può avere un numero illimitato di figli, può essere implementata usando un albero binario.

Per ogni nodo dell'albero, sostituirlo con un nodo con un puntatore destro e sinistro. Il puntatore a sinistra va al primo figlio del nodo. Il nodo destro va al prossimo fratello del nodo. Tutti i figli di un dato nodo sono in un elenco collegato unito dai loro puntatori di destra, con la testa dell'elenco puntata dal puntatore di sinistra del loro genitore.

Il tuo complicato albero n-ary è diventato un semplice albero binario.

Sono sicuro che questo è a Knuth, Vol. 1 da qualche parte.


Questa è un'implementazione davvero interessante. Ho ragione nel pensare che, poiché ciascun nodo figlio era l'inizio di un elenco collegato, l'albero non sarebbe più O (log) n) se bilanciato o O (n) in caso contrario, a causa del fatto che la visita di ciascun nodo sarebbe iniziata fuori da una ricerca lineare? Questa implementazione comporterebbe tempi di ricerca molto più lenti? Ma il lato positivo è che i tempi di ricerca sarebbero più rapidi di quelli di una struttura lineare standard? L'ho capito bene?
sw123456,

@ sw123456, Se l'albero originale fosse bilanciato, l'albero binario risultante quasi certamente non lo sarebbe. Credo che tutto il resto dipenderebbe dalla ventola dall'albero, da quanti bambini ha un determinato nodo. Una ricerca lineare si verificherebbe solo quando si scoprisse quale figlio di un dato nodo seguire. Ma non sono sicuro che potresti evitarlo in qualsiasi altra implementazione di un albero n-ary.
Justsalt,

2

Alberi binari perché usarli?

Nella programmazione lavori molto con raccolte di dati dello stesso tipo.

I due modi di base per archiviare questi dati sono: elenchi e matrici collegati.

Entrambi sono dotati di aspetti positivi e negativi: in un elenco collegato è facile aggiungere elementi in qualsiasi posizione o rimuovere elementi. Ma l'accesso a un elemento specifico è più difficile, perché devi passare attraverso l'elenco fino a raggiungere l'elemento che desideri.

  • Non cerca in modo efficiente ma l'inserimento e l'eliminazione sono facili.

Con un array l'accesso a un elemento specifico è facile, ma è più difficile inserire o eliminare un elemento perché l'inserimento significa: estendere l'array di uno, spostare tutti gli elementi prima della posizione di inserimento 1 a destra e inserire l'elemento.

  • Cerca in modo efficiente (se ordinato) ma l'inserimento e l'eliminazione sono difficili.

Quindi sia l'elenco collegato che l'array hanno degli svantaggi.

Gli alberi binari sono fatti per affrontare sia i problemi dell'array che l'elenco collegato:

  1. Facile inserimento ed eliminazione
  2. Ricerca facile

Quindi l'albero binario è fatto quando hai molti dati che cambiano regolarmente.

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.