Complexidade temporal de um loop triplo-aninhado


13

Por favor, considere o seguinte loop aninhado triplo:

for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j)
        for (int k = j; k <= n; ++k)
            // statement

A instrução aqui é executada exatamente vezes. Alguém poderia explicar como essa fórmula foi obtida? Obrigado.n(n+1)(n+2)6


1
A pergunta Fórmula de complexidade temporal de loops aninhados também pode ser interessante.
Juho

Respostas:


14

Você pode contar o número de vezes que o loop for mais interno é executado, contando o número de trigêmeos para os quais é executado.(i,j,k)

Pelas condições do loop, sabemos que: . Podemos reduzi-lo ao seguinte problema combinatório simples.1ijkn

  • Imagine caixas de cor vermelha colocadas em uma matriz da esquerda para a direita.n+2
  • Escolha quaisquer 3 caixas das caixas e pinte-as de azul.n+2
  • Forme um trigêmeo seguinte maneira: (i,j,k)
    • = 1 + número de caixas coloridas vermelhas à esquerda da primeira caixa azul.i
    • = 1 + número de caixas coloridas vermelhas à esquerda da segunda caixa azul.j
    • = 1 + número de caixas coloridas vermelhas à esquerda da terceira caixa azul.k

Então, só precisamos contar o número de maneiras de escolher 3 caixas de caixas que é ( n + 2n+2 .(n+23)


2
Boa resposta! Os valores exatos de i, j, k não são importantes. Só precisamos saber que qualquer caixa azul pode ser colocada em n posições possíveis e que suas posições são limitadas: a segunda vem sempre depois da 1ª e antes da 3ª.
Dávid Natingga

@rizwanhudda Limpar, exceto pela parte em n + 2 . Você pode explicar isso por favor? n + 3 se parece com o número certo. +2n+2n+3
Saadtaame

1
@saadtaame Sim. Você pode imaginar ter caixas vermelhas, mas ter liberdade para escolher 3 caixas vermelhas para pintar azul entre " n + 2 caixas vermelhas", pois não é possível colorir a primeira caixa como azul (Desde i 1 )n+3n+2i1
rizwanhudda

3

para mim, é mais fácil notar que o loop interno é executado vezes e o número total de execuções no loop interno éni

(ni)+(ni1)+(ni2)++1

isso pode ser reescrito como e é executado n vezes, portanto, o número total de execuções éj=0ninijn

i=0nj=0ninij=n(n+1)(n+2)6

Um desafio para você: imagine que você tem um loop x-aninhado. De acordo com a resposta anterior, ele executaria (n + x-1) escolher x vezes. Como você calcularia sua fórmula?
Dávid Natingga 25/08/12

felizmente, o OP não pediu x-nested! Como a outra resposta dada se expande para um loop x-aninhado? Minha resposta deve receber mais somas de 0 a n, 0 a n-i_1, 0 a n-i_2, ..., 0 a n-i_x. Mas eu não saberia como calcular isso.
22612 Andy

1
A resposta não se expande explicitamente para um x geral, mas o processo de raciocínio apresentado é fácil de seguir para loops x-aninhados. Você acabou de adicionar mais caixas azuis. Também não sei como calcularia essas mais somas.
Dávid Natingga 25/08/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.