2009-05-14 18 views
5

Come si fa a calcolare l'altezza media di un albero binario di ricerca durante l'aggiunta di 1000 interi casuali? Qual è l'altezza media?altezza media di un albero binario di ricerca

+0

Questo è un problema davvero interessante - mi chiedo se c'è una formula per questo. Uno dei fattori decisivi sarebbe se gli interi fossero autorizzati a corrispondere. In tal caso, qual è il range degli int inte (la probabilità che corrispondano). Questo potrebbe essere un fattore che influenza. –

+1

La risposta dipende dal tipo di albero binario che si sta utilizzando, sebbene l'algoritmo per calcolare la risposta, data una specifica istanza dell'albero, sia lo stesso. – Eddie

+0

Qual è il contesto, compiti a casa? Cosa intendi con "random int"? – starblue

risposta

4

È possibile calcolare l'altezza di un albero binario utilizzando questa definizione ricorsiva:

height(empty) = 0 
height(tree) = 1 + max(height(tree.left), height(tree.right)) 

Un modo per misurare empiricamente l'altezza media di un tale albero è quello di creare più volte un albero vuoto e aggiungere 1000 articoli casuali esso. Misurare l'altezza di ogni prova usando la funzione sopra, e mediali.

ho il sospetto il vostro compito è probabilmente quello di trovare una formula per l'altezza media di un albero binario.

+0

L'altezza (vuota) non deve essere -1 e l'altezza di un albero con un solo elemento è zero? – Pacerier

+0

@Pacerier: puoi definire l'altezza in questo modo, se preferisci, ma penso che sia più naturale definire zero l'altezza di un albero vuoto. –

0

dipende l'ordine sono aggiunti. Se inizi con il valore più piccolo, l'albero sarà più profondo perché tutti i nuovi valori verranno aggiunti al BST figlio destro. Se aggiungi prima il valore più grande, allora il figlio sinistro sarà in profondità mentre il diritto è vuoto.

5

Dipende se si sta utilizzando qualsiasi tipo di struttura ad albero bilanciato (come ad esempio un albero rosso-nero). Dato che stai inserendo numeri casuali in un albero binario, è ragionevole aspettarsi che la profondità media sia approssimativamente log2 (1000), quindi i valori 10 e 11 sarebbero "normali". Non sono sicuro di quanto lontano potrebbe deviare da ciò; non più profondo di 10 livelli, forse un po 'più profondo. Un caso estremo senza bilanciamento sarebbe 1000 profondi; è improbabile che accada con numeri casuali.

-2

Indipendentemente da quale albero si utilizza l'altezza media sarà log2 (1000), come qualcuno ha detto prima. E 'vero che a seconda dell'ordine dei numeri inserito l'altezza effettiva può variare, ma assumendo i numeri distribuiti in modo casuale, che voi dite, allora il valore effettivo, il più delle volte, approssimare il valore atteso (che, ancora una volta, è log2 (1000))

+1

Questo è sbagliato. Affinché un albero binario sia bilanciato, l'elemento mediano deve essere il primo nodo aggiunto. Ci sarà solo una possibilità 1/N di iniziare con questo, e anche dopo questo i sotto-alberi su entrambi i lati dovranno essere bilanciati. C'è in realtà una probabilità molto bassa che sarà log2 (1000) per caso, una piccola frazione di 1/1000. –

+0

L'altezza media sarà O (log_2 (1000)) - i numeri effettivi sono più simili a 4.3 ln (1000) - 1.9 ln (ln (n)) - 3. http://goo.gl/cZMZoY – wcochran

1

questa domanda è, infatti, difficile. La risposta non sarà 1000, perché è improbabile, ma anche log2 (1000) è improbabile, ma ancora di più a seconda di come viene coltivato l'albero.

Se si aggiunge un int facendo un passo anche se l'albero poi ingenuamente aggiungendo che l'albero sarà virtualmente sempre più alto di log2 (1000).

Parla con un esperto di statistica, perché questo sembra essere legata a normali distribuzioni di probabilità. Quelli sono generati da un sacco di eventi casuali iterati (testa una unità a destra, code ditto a sinistra), e il valore di un intero casuale itera attraverso l'albero mentre si deposita in una foglia.

10

Questa domanda mi ha fatto chiedere se è possibile lavorare definitivamente questo fuori senza realmente generare gli alberi.

sono riuscito a scrivere un'applicazione che potrebbe calcolare la risposta a ciò che l'altezza media sarebbe se si è aggiunto ogni possibile permutazione dei numeri unici N ad un albero binario ingenuamente implementato.

Le risposte che ho ricevuto sono in questo grafico. (L'asse X è il numero di elementi nella struttura, la linea blu è l'altezza media, e la linea rossa è l'altezza ottimale possibile)

Graph of average height to minimum height

 
N  Average Height 
2  2 
16 7.039 
32 9.280 
64 11.679 
256 16.783 
343 17.896 

Granitebolshevik ragione: è possibile ma statisticamente improbabile che un albero ingenuamente implementato sia l'altezza ottimale, senza funzionalità di bilanciamento extra.

L'algoritmo ha una complessità di O (N^2) e non è abbastanza veloce per calcolare numeri veramente grandi.

+1

Bel lavoro. Hai provato qualche tipo di estrapolazione dai valori che hai ottenuto a N = 1000? L'estrapolazione lineare grezza basata su H = 14 (a circa N = 120) e H = 18 (a circa N = 350) suggerisce H = 29 (~ 560/230 * 4 + 19) a N = 1000. La curva è più piatta di quella; è probabilmente più vicino all'intervallo 25-27, mi sembra. –

+1

Si adatta a 4.311 * ln (N) - 1.953 ln (ln (N)) + C abbastanza bene con C circa -3. Formula da http://goo.gl/cZMZoY. – wcochran

3

Non sembra essere una semplice risposta a questa domanda, anche se ci sono una serie di approssimazioni numeriche, es .:

Devroye, Luc. "Una nota sull'altezza degli alberi di ricerca binari." Journal of the ACM (JACM) 33.3 (1986): 489-498.

Reed, Bruce. "L'altezza di un albero di ricerca binario casuale." Journal of the ACM (JACM) 50.3 (2003): 306-332.

http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap13.htm

Queste approssimazioni generalmente prendono la forma: A ln n - B ln ln n + C

Dove A~4.311 e B~1.953

Quindi probabilmente la cosa più utile da dire è che l'altezza media per inserimenti casuali è O(log n), ma se effettivamente hai bisogno di un'approssimazione numerica, penso che (4.311 ln n - 1.953 ln ln n) sarebbe abbastanza vicino per il grande n.

per n=1000, che fornisce circa 26 - che si adatta perfettamente ai risultati sperimentali riportati altrove.

+0

Seguendo @ andrew-shepherd sopra sembra che C sia intorno a -3. – wcochran

Problemi correlati