Quante volte è stato eseguito il comando? Stai cercando un errore

4

Ho il seguente codice:

int sum = 0;
for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++)
        for (int k = 1; k <= N; k = k*2)
            for (int h = 1; h <= k; h++)
                sum++;

Quindi ho calcolato quanto esegue ogni ciclo e poi tutto lo script, e penso che potrei sbagliarmi per l'ultimo.

1. N
2. N
3.  1 + log2N( means log N to the base 2)
4. N

Quindi la quantità totale di esecuzione del ciclo interno sarebbe N ^ 3 * (1 + log2N).

Ho ragione? Come posso trasformare questa affermazione?

UPDATE 1

Ho un'altra soluzione che sembra mostruosa:

1. N
2. N
3. LOG2(N) + 1
4. 2^(LOG2(2N)) - 1

Quindi l'importo totale dei cicli sarebbe n^2 * (LOG2(N) + 1) * 2^(LOG2(2N)) - 1 .

Che si trasforma in n ^ 2 ordine di crescita.

UPDATE 2

Ho scritto una semplice app di test per verificare la mia ipotesi.

sembra che il terzo ciclo sia già calcolato per qualche motivo è il quarto. Almeno questo è il risultato dell'applicazione di test. Ho buttato via (LOG2(N) + 1) .

Come risultato di diverse trasformazioni ho seguito l'equazione per la quantità totale di chiamate sum ++:

N*N*(2*N - 1) = 2 * N^3 - N^2 ~ N^3
    
posta Jevgeni Smirnov 13.02.2013 - 09:20
fonte

1 risposta

1

I primi due loop non sono interessanti: danno solo N^2 moltiplicatore.

Il quarto ciclo all'interno del terzo ciclo dà una progressione geometrica: 1,2,4,8, ...

Assolutamente aumenterà sum di 2M-1 dove M è la più grande potenza di 2 in meno di N .

Quindi totalmente: N^2*(2*M-1)

In termini di big-O che è O (N ^ 3).

    
risposta data 13.02.2013 - 13:51
fonte

Leggi altre domande sui tag