2013-09-26 16 views
7

Attualmente sto studiando algoritmi di base per Big Oh. Mi stavo chiedendo se qualcuno può mostrarmi quale sia il codice per (n log n) in Java usando Big Oh sarebbe come o indirizzarmi a qualsiasi pagina SO in cui esista.Big Oh per (n log n)

Dato che sono solo un principiante, posso solo immaginare il codice prima di scriverlo. Quindi, teoricamente (almeno), dovrebbe contenere uno per ciclo in cui abbiamo qualcosa di n volte. Quindi per il log n, possiamo usare il ciclo while. Quindi il ciclo viene eseguito n volte e il ciclo while viene eseguito base di log 2 volte. Almeno è così che lo sto immaginando nella mia testa ma vedere il codice chiarirebbe le cose.

+0

Non sono sicuro di aver capito bene. Stai chiedendo un esempio di un algoritmo con una complessità temporale in O (n log n)? – Carsten

+0

Prova a studiare qualsiasi buon algoritmo di ordinamento come merge sort. Il seguente link può aiutarti http://stackoverflow.com/questions/1592649/examples-of-algorithms-which-has-o1-on-log-n-and-olog-n-complexities –

+0

Sì. Voglio solo vedere come sarà il codice in un programma Java. –

risposta

2

Un algoritmo O (n log n) molto popolare è un tipo di unione. http://en.wikipedia.org/wiki/Merge_sort ad esempio dell'algoritmo e dello pseudocodice. La parte di registro n dell'algoritmo viene ottenuta suddividendo il problema in sottoproblemi più piccoli, in cui l'altezza dell'albero di ricorsione è log n.

Un sacco di ordinamenti di algortihms ha il tempo di esecuzione di O (n log n). Fare riferimento a http://en.wikipedia.org/wiki/Sorting_algorithm per ulteriori esempi.

1

http://en.wikipedia.org/wiki/Heapsort

Semplice esempio è proprio come lei ha descritto - eseguire n volte qualche operazione che prende log (n). Gli alberi binari bilanciati hanno altezza log (n), quindi alcuni algoritmi ad albero avranno una tale complessità.

28
int n = 100 
for(int i = 0; i < n; i++) //this loop is executed n times, so O(n) 
{ 
    for(int j = n; j > 0; j/=2) //this loop is executed O(log n) times 
    { 

    } 
} 

Spiegazione: Il ciclo for esterno dovrebbe essere chiaro. Viene eseguito n volte. Ora al ciclo interno. Nel ciclo interno basta prendere n e dividerlo sempre per 2. quindi ti chiedi: quante volte posso dividere n per 2.

Si scopre che questo è in O (log n). (in effetti la base del log è 2, ma nella notazione Big-Oh lasciamo la base poiché aggiungerebbe solo alcuni fattori al nostro log che non ci interessano).

Quindi si sta eseguendo un ciclo n volte e all'interno di quel ciclo si sta eseguendo un altro ciclo log(n) volte in modo da avere O(n) * O(log n) = O(n log n).

+3

Questo sarebbe O (n log n), ma non è realistico. Quasi tutti gli algoritmi * all * O (n log n) sono ricorsivi. Forse potresti offrire una forma più tipica. –

+4

Questo esempio ha lo scopo di fornire un esempio molto semplice su cosa sia O (n log n). Non vedrai quell'algoritmo in realtà. Sì, quegli algoritmi sono ricorsivi ma spiegare O (n log n) in modo iterativo è più facile da capire. La chiave è vedere che dividi sempre n per due. Questa è una caratteristica chiave nella maggior parte degli algoritmi come Mergesort, dove si chiama lo stesso algoritmo per ogni metà. Ho pensato che sarebbe stato appropriato dal momento che parlava di cicli annidati nella sua domanda. – slashburn

+1

@slashburn grazie, questa è la spiegazione più semplice ..! – TheFlash

2

Algoritmi con una complessità di tempo O(.) che coinvolge log n implicano in genere alcune forme di divisione e conquista.

Ad esempio, in MergeSort l'elenco viene dimezzato, ogni parte viene singolarmente fusa e quindi le due metà vengono unite. Ogni lista è dimezzata.

Ogni volta che il lavoro viene dimezzato o ridotto di dimensioni di un fattore fisso, di solito si finisce con un componente log n dello O(.).

In termini di codice, dare un'occhiata all'algoritmo di MergeSort. La caratteristica importante, tipica delle implementazioni, è che è ricorsiva (si noti che lo TopDownSplitMerge si chiama due volte nel codice fornito su Wikipedia).

Tutti gli algoritmi di ordinamento di buon livello hanno complessità temporale O(n log n) e non è possibile fare di meglio nel caso peggiore, vedere Comparison Sort.

Per vedere come appare nel codice Java, solo search! Here's one example.

Problemi correlati