2011-01-31 16 views
5

Ok, so che Mergesort ha il tempo peggiore di theta (NlogN) ma il suo overhead è elevato e si manifesta vicino al fondo dell'albero di ricorsione dove vengono effettuate le unioni. Qualcuno ha proposto di interrompere la ricorsione una volta che le dimensioni raggiungono K e passare all'ordinamento per inserimento in quel punto. Devo dimostrare che il tempo di esecuzione di questa relazione di ricorrenza modificata è theta (NK + Nlog (N/k))? Sto blanking su come affrontare questo problema ..Dimostra che il tempo di esecuzione di mergesort ottimizzato è theta (NK + Nlog (N/K))?

risposta

3

Forse un buon inizio è guardare la relazione di ricorrenza per questo problema. Immagino che per le tipiche Mergesort sarebbe simile a questa:

T(N) = 2 * T(N/2) + N 

vale a dire che si sta dividendo il problema in sottoproblemi 2 della metà delle dimensioni, e quindi l'esecuzione di lavori N (l'unione). Abbiamo un caso base che richiede tempo costante.

Modellazione questo come un albero che abbiamo:

T(N) = N -> T(N/2) 
       -> T(N/2) 

     = N -> (N/2) -> T(N/4) 
           -> T(N/4) 
       -> (N/2) -> T(N/4) 
           -> T(N/4) 

Questo dà un ampliamento della

T(N) = N + 2N/2 + 4N/4 + ... 
    = N + N + N ... 

Quindi, in realtà abbiamo solo bisogno di vedere quanto in profondità si va. Sappiamo che il livello i opera su sottoproblemi N/2^i di dimensioni. Così i nostri nodi foglia (T(1)) si verificano a livello L dove N/2^L = 1:

N/2^L = 1 
N = 2^L 
log N = log(2^L) 
log N = L 

Quindi il nostro tempo di esecuzione è N log N.

Ora introduciamo l'ordinamento di inserimento. Il nostro albero sarà simile a questa

T(N) = ... -> I(K) 
      -> I(K) 
      ...x N/K 

In altre parole, ci sarà a un certo livello L dover risolvere i problemi N/K insertion sort di dimensioni K. L'ordinamento di inserimento ha un runtime nel caso peggiore di K^2. Quindi, le foglie che hanno questo molto lavoro in totale:

(N/K) * I(K) 
= (N/K) * K * K 
= N * K 

ma abbiamo anche un po 'di fusione di fare così, ad un costo di N per ogni livello dell'albero come spiegato in precedenza. Tornando al nostro metodo precedente, troviamo L (il numero di livelli prima di raggiungere sottoproblemi di dimensione K e quindi passare a inserimento):

N/2^L = K 
N/K = 2^L 
L = log (N/K) 

Quindi, in totale abbiamo

O(N) = N * K + N * log (N/K) 

E 'stato troppo tempo da quando ho preso gli algoritmi per darti una bozza di prova, ma questo dovrebbe far esplodere i tuoi neuroni.