Nota: Questo è problema 4,3 da Cracking Intervista Coding 5th EditionQuesto algoritmo dovrebbe essere eseguito in O (n)?
Problema: Dato un ordinato (ordine crescente) array, scrivere un algoritmo per creare un albero binario di ricerca con l'altezza minima
Ecco il mio algoritmo, scritto in Java per fare questo problema
public static IntTreeNode createBST(int[] array) {
return createBST(array, 0, array.length-1);
}
private static IntTreeNode createBST(int[] array, int left, int right) {
if(right >= left) {
int middle = array[(left + right)/2;
IntTreeNode root = new IntTreeNode(middle);
root.left = createBST(array, left, middle - 1);
root.right = createBST(array, middle + 1, right);
return root;
} else {
return null;
}
}
ho controllato questo codice contro l'autore del ed è quasi identico.
Tuttavia, sto attraversando un periodo difficile con l'analisi della complessità temporale di questo algoritmo.
So che non funzionerebbe in O (logn) come Binary Search perché non stai facendo la stessa quantità di lavoro ad ogni livello di ricorsione. E.G al primo livello, 1 unità di lavoro, 2 ° livello - 2 unità di lavoro, 3 ° livello - 4 unità di lavoro, fino a registrare (n) livello - n unità di lavoro.
Quindi in base al largo che, il numero di passi questo algoritmi prende sarebbe superiore delimitata da questa espressione matematica
che dopo aver visto Infinite geometric series, ho valutato a
o 2n che sarebbe in O (n)
Siete d'accordo con il mio lavoro qui e che questo algoritmo sarebbe eseguito in O (n) o mi sono perso qualcosa o effettivamente eseguito in O (nlogn) o qualche altra classe di funzione?
Sì, è O (n). Lo farei una risposta se avessi un'idea più chiara di ciò che costituisce una buona prova di complessità. – Beta
@Beta Come sei stato in grado di dire senza una prova? – committedandroider
Ho visto che l'algoritmo si chiama due volte, ogni volta su n/2 elementi, con O (1) lavoro extra e un elemento rimosso. Non penso che sia una dimostrazione rigorosa (come in "Sia' f (n) 'e' g (n) 'siano funzioni tali che ..."), ma è stato sufficiente che io potessi vederlo nella mia testa, come un pezzo di corda tagliato a pezzi e disposto senza sovrapposizioni. – Beta