È O (log n) sempre un albero?

voti
6

Abbiamo sempre vedere le operazioni su un (binario di ricerca) albero è O (log n) caso peggiore tempo di esecuzione per l'altezza dell'albero è logn. Mi chiedo se ci viene detto che un algoritmo ha tempo di esecuzione in funzione di logn, ad esempio m + nlogn, possiamo concludere che deve comportare un (aumentata) albero?

EDIT: Grazie per i vostri commenti, ora mi rendo conto dividere et impera e albero binario sono così simili visivamente / concettualmente. Non avevo mai fatto un collegamento tra i due. Ma penso a un caso in cui O (log n) non è un divide et impera algo che coinvolge un albero che non ha proprietà di un BST / AVL / rosso-nero albero.

Questa è la struttura di dati set disgiunti con le operazioni / Unione Trova, il cui tempo di esecuzione è O (N + MlogN), con N è il # di elementi e M il numero di operazioni Trova.

Per favore fatemi sapere se mi manca sth, ma non riesco a vedere come divide et impera entra in gioco qui. Ho appena vedere, in questo caso (insieme disgiunto) che ha un albero con alcuna proprietà BST e un tempo di esecuzione essendo una funzione di log N. Quindi la mia domanda è sul perché / perché non posso fare una generalizzazione da questo caso.

È pubblicato 22/02/2010 alle 05:25
fonte dall'utente
In altre lingue...                            


7 risposte

voti
7

No, si può anche cercare binario un array ordinato (per esempio). Ma non prendere la mia parola per esso http://en.wikipedia.org/wiki/Binary_search_algorithm

Risposto il 22/02/2010 a 05:26
fonte dall'utente

voti
3

Come esempio contatore:

given array 'a' with length 'n'
y = 0
for x = 0 to log(length(a))
    y = y + 1
return y

Il tempo di esecuzione è O (log (n)), ma nessun albero qui!

Risposto il 22/02/2010 a 05:28
fonte dall'utente

voti
0

Algoritmi prendendo tempo logaritmico sono comunemente trovati in operazioni su alberi binari.

Esempi di O (log n):

  • Trovare un elemento in un array ordinato con una ricerca binario o un albero di ricerca bilanciato.

  • Cercare un valore in un array di input ordinati per bisezione.

Risposto il 22/02/2010 a 05:40
fonte dall'utente

voti
7

Quello che hai è esattamente al contrario. O(lg N)significa generalmente una sorta di divide et impera algoritmo, e un modo comune per implementare divide et impera è un albero binario. Mentre gli alberi binari sono un sottoinsieme sostanziale di tutti gli algoritmi divide et impera, la sono un sottoinsieme comunque.

In alcuni casi, è possibile trasformare altri algoritmi divide et impera abbastanza direttamente in alberi binari (ad esempio commenti su un'altra risposta hanno già fatto un tentativo sostenendo una ricerca binaria è simile). Solo per un altro esempio ovvio, tuttavia, un albero a più vie (ad esempio un albero B, B + albero o albero B *), mentre chiaramente un albero è altrettanto chiaramente non un albero binario.

Anche in questo caso, se si vuole abbastanza male, si può allungare il punto che un albero a più vie può essere rappresentato come una specie di versione distorta di un albero binario. Se si vuole, si può probabilmente allungare tutte le eccezioni al punto di dire che tutti sono (almeno qualcosa di simile) alberi binari. Almeno per me, però, tutto ciò che fa è rendere "albero binario" sinonimo di "divide et impera". In altre parole, tutto quello che realizzare è orditura del vocabolario e cancellando in sostanza, un termine che è sia distinta e utile.

Risposto il 22/02/2010 a 06:45
fonte dall'utente

voti
2

La risposta è no. La ricerca binaria di un array ordinato èO(log(n)) .

Risposto il 22/02/2010 a 06:48
fonte dall'utente

voti
0

Come O (log (n)) è solo un limite superiore anche tutti O (1) algoritmi come function (a, b) return a+b;soddisfare la condizione.

Ma io sono d'accordo tutti Theta (log (n)) algoritmi po 'assomigliano algoritmi ad albero o almeno possono essere astratte ad un albero.

Risposto il 22/02/2010 a 07:26
fonte dall'utente

voti
0

Risposta breve:

Solo perché un algoritmo ha log (n) come parte della sua analisi non vuol dire che un albero è coinvolto. Ad esempio, il seguente è un algoritmo molto semplice che èO(log(n)

for(int i = 1; i < n; i = i * 2)
  print "hello";

Come si può vedere, nessun albero è stato coinvolto. John, fornisce anche un buon esempio di come binario di ricerca può essere fatto su un array ordinato. Questi entrambi prendono O (log (n)), e ci sono altri esempi di codice che potrebbero essere creati o referenziati. Quindi non fare ipotesi in base alla complessità temporale asintotica, guardare il codice per sapere con certezza.

Altre info su alberi:

Solo perché un algoritmo coinvolge "alberi" non implica O(logn)neanche. È necessario conoscere il tipo di albero e come l'operazione influenza l'albero.

Qualche esempio:

  • Esempio 1)

L'inserimento o la ricerca del seguente albero sbilanciato sarebbe O(n).

entrare descrizione dell'immagine qui

  • Esempio 2)

Inserimento o cercare i seguenti alberi bilanciati sarebbero entrambi da O(log(n)).

Balanced Albero binario:

entrare descrizione dell'immagine qui

Albero equilibrata di Grado 3:

entrare descrizione dell'immagine qui

Commenti aggiuntivi

Se gli alberi si utilizza non hanno un modo di "equilibrio" che c'è una buona probabilità che le operazioni saranno O(n)non il tempo O(logn). Se si utilizzano alberi che sono auto bilanciamento, quindi inserisce normalmente prendere più tempo, come il bilanciamento degli alberi normalmente si verificano durante la fase di inserimento.

Risposto il 27/04/2016 a 00:55
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more