Recebi uma tarefa de casa com Big O. Estou preso a aninhados para loops que dependem do loop anterior. Aqui está uma versão alterada da minha pergunta de lição de casa, pois eu realmente quero entender:
sum = 0;
for (i = 0; i < n; i++
for (j = 0; j < i; j++)
sum++;
A parte que está me excitando é a j < i
parte. Parece que seria executado quase como um fatorial, mas com adição. Qualquer dica seria muito apreciada.
Respostas:
Então, deixe-me esclarecer algumas coisas, você está interessado na notação big-O - isso significa limite superior . Em outras palavras, não há problema em contar mais etapas do que você realmente faz. Em particular, você pode modificar o algoritmo para
Portanto, você tem dois loops aninhados, cada loop é executado vezes, o que fornece um limite superior de O ( n 2 )n O ( n2)
Obviamente, você gostaria de ter uma boa estimativa para o limite superior. Portanto, para conclusão, queremos determinar um limite inferior. Isso significa que não há problema em contar menos etapas. Então considere a modificação
Aqui, realizamos apenas algumas das iterações de loop. Mais uma vez que têm dois circuitos encaixados, mas desta vez que temos iterações por ciclo, o que mostra que têm, pelo menos, n 2 / 4 adições. Nesse caso, denotamos esse limite inferior assintótico por Ω ( n 2 ) . Como os limites inferior e superior coincidem, podemos até dizer que n 2 é um limite assintótico apertado e escrevemos Θ ( n 2 ) .n / 2 n2/ 4 Ω ( n2) n2 Θ ( n2)
Se você quiser saber mais, leia aqui .
fonte
Vamos traçar isso:
0<0 == false
).Este algoritmo incrementará
sum
o seguinte número de vezes:fonte
vamos ver se consigo explicar isso ...
Portanto, se o loop interno fosse j
Agora, para a primeira iteração, você faz n- (n-1) vezes no loop interno. na segunda vez, você faz n- (n-2) vezes no loop interno. Na enésima vez, você faz n- (nn) vezes, o que é n vezes.
se você calcular a média do número de vezes que passa pelo loop interno, seria n / 2 vezes.
Então você poderia dizer que isto é O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)
Isso faz sentido?
fonte
j < i
parte era realmentej < i^2
, o O resultante para essa parte seria n ^ 2/2?