Os loops aninhados são sempre O (n ^ k)?

9

Se eu tiver um loop dentro de outro loop, mas sei que o loop interno será executado apenas uma vez, esse algoritmo ainda será O (n ^ 2)?

For i = 1 to n do

     For j = 1 to i do

          If (i==j) do

              For k = 1 to n

                  {Do stuff}

O loop interno será executado no máximo 1 vez, pois iserá igual apenas uma jvez por iteração do segundo loop. Ainda é n ^ 3?

John
fonte

Respostas:

7

Pense desta maneira. Independentemente de N, a função mais interna será executada apenas uma vez por execução do segundo loop. Ou seja, a quantidade de vezes que ele executa depende de N linearmente. Isso significa que você pode tratar tudo dentro do primeiro loop como uma operação de tempo linear (O (n)) (assumindo que {do ​​stuff} também seja tempo constante). Se você considerar o loop mais externo, verá que faz algo que leva O (n), n vezes. Isso significa que o tempo de execução geral é O (n ^ 2)

Se você dobrar N, haverá um total de N ^ 2 iterações extras. Portanto, o tempo de execução geral é N ^ 2.

Oleksi
fonte
Muito obrigado! Isto é o que eu acreditava, mas a maneira que eu sempre pensei de loops aninhados me confundiu
john
@ john, não é um problema. É complicado acertar. Ajuda se você pensar em dobrar N e depois perguntar como isso afeta a quantidade de vezes que você faz alguma coisa.
Oleksi
Hã? O primeiro e o TERCEIRO loop dependem de n. A condicional é verdadeira apenas uma vez por execução do segundo loop. Temos duas tarefas n ^ 2 aqui, o par de loop ij e o par de loop ik. O resultado ainda é n ^ 2, no entanto.
Loren Pechtel
@LorenPechtel whoops. Desculpa. Eu ignorei isso. Eu atualizei a resposta para refletir isso.
Oleksi
9

Não, loops aninhados não significam automaticamente que seu algoritmo é O (n ^ k). A unidade básica de trabalho no seu exemplo é {Do stuff}, portanto, você precisa contar quantas vezes isso será executado à medida que naumenta. Você nem precisa do jloop, pois conta apenas de 1 a ie não faz nada até chegar i. Somente nessa iteração ele realmente funciona, portanto seu código de exemplo é O (n ^ 2).

Bill the Lizard
fonte