2011-10-03 1 views
5

Ho avuto questa domanda per il mio incarico l'altro giorno, ma non ero ancora sicuro se avessi ragione.Big O per loop while

for(int i =1; i <n; i++) //n is some size 
{    
    for(j=1; j<i; j++) 
    { 
     int k=1; 

     while (k<n) 
     { 
      k=k+C; //where C is a constant and >=2 
     } 
    } 
} 

So che i cicli nidificati sono O (n^2) ma non ero sicuro del ciclo while. Ho assunto che l'intero codice sarà O (n^3).

+0

Vuoi dire che DeCaf

+0

@DeCaf Suppongo che era un errore di battitura –

+0

Si prega di correggere gli errori nella domanda e formattarlo in modo coerente. –

risposta

2
int k=1; 

    while (k<n){ 
     k=k+C     //where C is a constant and >=2 
    } 

Questo richiederà (n-1)/C passi: scrivere u = (k-1)/C. Poi, k = Cu + 1 e la dichiarazione diventa

u=0; 
while(u < (n-1)/C) { 
    u=u+1 
} 

Da qui il ciclo while è O(n) (dal C è costante)

EDIT: Vorrei provare a spiegare il contrario.

Inizia con una variabile fittizia u. Il ciclo

u=0; 
while(u < MAX) { 
    u = u+1 
} 

corre MAX volte.

Quando si lascia MAX = (n-1)/C, il ciclo è

u=0; 
while(u < (n-1)/C) { 
    u=u+1 
} 

E che corre (n-1)/C volte.

Ora, il controllo u < (n-1)/C è equivalente a C*u < n-1 o C*u + 1 < n, in modo che il ciclo è equivalente a

u=0; 
while(C*u + 1 < n) { 
    u=u+1 
} 

Ora, supponiamo che abbiamo riscritto questo ciclo in termini di una variabile k = C * u + 1. Poi,

u=0; 
k=1; // C * 0 + 1 = 1 

Il ciclo sembra

while(C*u + 1 < n) { 
while(k < n) { 

e la condizione interna è

u=u+1 
    k=k+C //C * (u+1) + 1 = C * u + 1 + C = old_k + C 

Mettere tutto insieme:

int k=1; 

    while (k<n){ 
     k=k+C 
    } 

prende (n-1)/C passi.

+0

Sono confuso perché hai "tu". Puoi approfondire questo argomento? – user977151

+0

@ user977151 la cosa più semplice è qualcosa che va un passo alla volta. Ho provato a ripetere l'analisi al contrario –

1

Il ciclo interno è letteralmente O(n/C)=O(n), quindi sì, nel complesso è O(n^3) (il secondo ciclo ha un limite superiore di O(n))

+0

Grazie per la tua risposta :) – user977151

0

Beh, si avrebbe bisogno di guardare quante volte il corpo del ciclo, mentre viene eseguito per un dato valore di n e C. Per esempio n è 10 e C è 3. Il corpo dovrebbe eseguire 3 volte: k = 1, k = 4, k = 7. Per n = 100 e C = 2, il corpo dovrebbe eseguire 50 volte: k = 1,3,5,7,9, ..., 91,93,95,97,99. Si tratta di contare da C fino al n. Dovresti essere in grado di calcolare la complessità del Big-O da quella chiave.

+2

Non mi piace il tuo approccio al conteggio a sequenze infinite (questo è ciò che asintotico significa btw) ... Un semplice "il numero di cicli cresce linearmente con' n' a una velocità di 1/2 "sarebbe più facile da capire e molto più accurata. – Blindy

1

Formalmente, si può procedere con la seguente metodologia (Sigma Notation):

enter image description here

Dove a simboleggia il numero di operazioni costanti all'interno del ciclo più interno (a = 1 se si desidera contare il numero esatto di iterazioni).

+0

Triste il imgur.com è completamente bloccato dal proxy delle mie società: | –

+0

Puoi [interpretare il codice LaTeX] (http://www.codecogs.com/latex/eqneditor.php)? Posso condividere lo script con te. –

+0

Impossibile trovare una citazione da SO su di esso atm. Personalmente penso che sarebbe bello (e il lattice potrebbe anche essere indicizzato che una foto non può), ma non sono sicuro che gli altri lo apprezzerebbero perché potrebbero confondere i lettori del tuo post, a seconda di come lo aggiungerei , quindi lo guarderò a casa. [Forse qualcuno dovrebbe chiedere a SO di integrare una sorta di Latex per il renderer html (http://stackoverflow.com/questions/116054/what-is-the-best-way-to-embed-latex-in-a-webpage) ] –