Big O: nidificato per loop con dipendenza


9

Mi è stato assegnato un compito a casa con Big O. Sono bloccato con i cicli nidificati che dipendono dal ciclo precedente. Ecco una versione modificata della mia domanda di compiti a casa, dal momento che voglio davvero capirlo:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

La parte che mi sta gettando via è la j < iparte. Sembra che sarebbe eseguito quasi come un fattoriale, ma con l'aggiunta. Eventuali suggerimenti sarebbero davvero apprezzati.


Bella spiegazione qui
saadtaame,

Risposte:


10

Consentitemi di chiarire alcune cose, siete interessati alla notazione big-O - questo significa limite superiore . In altre parole, va bene contare più passaggi di quanti ne facciano realmente. In particolare, è possibile modificare l'algoritmo in

 ...
    for (j = 0; j < n; j++) 
 ...

Quindi hai due loop nidificati, ogni loop viene eseguito volte, il che ti dà un limite superiore diO ( n 2 )nO(n2)

Certo, ti piacerebbe avere una buona stima per il limite superiore. Quindi per il completamento, vogliamo determinare un limite inferiore. Questo significa che va bene contare meno passaggi. Quindi considera la modifica

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

Qui eseguiamo solo alcune delle iterazioni in loop. Ancora una volta abbiamo due loop nidificati, ma questa volta abbiamo iterazioni per loop, il che dimostra che abbiamo almeno aggiunte. In questo caso denotiamo questo limite inferiore asintotico di . Poiché il limite inferiore e superiore coincidono, possiamo persino dire che è un limite asintotico stretto e scriviamo .n 2 / 4 Ω ( n 2 ) n 2 Θ ( n 2 )n/2n2/4Ω(n2)n2Θ(n2)

Se vuoi saperne di più, leggi qui .


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Tracciamo questo:

  • Quando i = 0, il ciclo interno non funzionerà affatto ( 0<0 == false).
  • Quando i = 1, il ciclo interno verrà eseguito una volta (per j == 0).
  • Quando i = 2, il ciclo interno verrà eseguito due volte. (per j == 0 e j == 1).

Questo algoritmo aumenterà così sumil seguente numero di volte:

x=1nx1=0+1+2+3+4...+n1=n(n1)2

n n2n2n2n2θ(n2)O(n2) and Ω(n2)


3

vediamo se posso spiegare questo ...

Quindi se il ciclo interno era j

Ora, per la prima iterazione, fai n- (n-1) volte attraverso il ciclo interno. la seconda volta che fai n- (n-2) volte attraverso il ciclo interno. All'ennesima volta fai n- (nn) volte, che è n volte.

se si calcola la media del numero di volte in cui si passa attraverso il ciclo interno, sarebbe n / 2 volte.

Quindi potresti dire che è O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Ha senso?


È un po 'strano, ma penso di averlo capito! Grazie! Potrebbe volerci un po 'di tempo per affondare fino in fondo in haha

Quindi se quella j < iparte fosse effettivamente j < i^2, la O risultante per quella porzione sarebbe n ^ 2/2?

Prima di tutto nota che O (n ^ 2/2) = O (n ^ 2). Ora se lo cambi in j <i ^ 2, allora stai facendo (n- (n-1)) ^ 2 sulla prima iterazione e n ^ 2 sull'ultima iterazione. Non ricordo quale sarebbe la notazione big-O per il ciclo interno. O (n ^ 2) è un limite superiore sciolto. Quindi un limite superiore libero per l'intera cosa sarebbe O (n ^ 3), ma quel ciclo interno è inferiore a O (n ^ 2). Ha senso?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.