Erro no uso de notação assintótica


10

Estou tentando entender o que há de errado com a seguinte prova da recorrência a seguir

T(n)=2T(n2)+n
T(n)2(cn2)+ncn+n=n(c+1)=O(n)

A documentação diz que está errado por causa da hipótese indutiva de que

T(n)cn
O que estou perdendo?

2
Recorrências dessa forma também podem ser resolvidas usando o teorema do mestre .
Juho

2
@Ran: Eu não acho que o teorema mestre é uma marca apropriada para esta pergunta. A questão não é sobre como resolvê-lo, mas apontar a falácia em um argumento específico. Além disso, o teorema-mestre é provavelmente muito específico e provavelmente não merece ter seu próprio tag. Em geral, devemos etiquetar com base na pergunta, não nas respostas possíveis. Por exemplo, você classificaria esse akra-bazzi?
Aryabhata

"o que há de errado com a seguinte prova" - não vejo uma prova. Muitas vezes, é útil escrever uma prova completa (por exemplo, tornar a indução explícita) para detectar erros.
Raphael

Respostas:


12

Digamos que o objetivo final seja provar . Você começa com a hipótese de indução:T(n)=O(n)

para todos os i < n .T(i)cii<n

E para completar a prova, você deve mostrar que também.T(n)cn

No entanto, você pode deduzir é , o que não é útil para concluir a prova; você precisa de uma constante c para (quase) todo n . Portanto, não podemos concluir nada e T ( n ) = O ( n ) não está provado.T(n)(c+1)ncnT(n)=O(n)

Observe que você está confuso entre o resultado e o processo de prova. E mais um ponto, é realmente Θ ( n log n ) nesse caso, portanto, você pode considerar uma hipótese de indução apropriada para poder provar isso.T(n)Θ(nlogn)


se substituirmos c '= c + 1, isso fará alguma alteração?
Erb

@erb: Não, não vai. Você tem que provar uma constante escolhida. Se substituir , você terá T ( n ) ( c + 1 ) n (ou T ( n ) ( c + 2 ) n ), então o resultado será o mesmo. c=c+1T(n)(c+1)nT(n)(c+2)n
pad

8

Você omitiu alguns passos. Parece que você está tentando provar por indução que , e sua prova é:T(n)=O(n)

Suponha que para k < n . Isso significa T ( k ) cT(k)=O(k)k<n para alguns c . Em seguida, T ( n ) = 2 T ( n / 2 ) + n 2 c n / 2 + n ( c + 1 )T(k)ckc , então T ( n ) = O ( n ) .T(n)=2T(n/2)+n2cn/2+n(c+1)nT(n)=O(n)

Esta prova dá errado desde o início: “ para k < n ” não faz sentido. Oh grande é uma noção assintótica: T ( k ) = O ( k ) significa que existe alguma constante c e um limiar N tal que k N , T ( k ) cT(k)=O(k)k<nT(k)=O(k)c . E, novamente, no final, você não pode concluir que “ T ( n ) = O ( n ) ”, porque isso diz algo sobre a função T como um todo e você só provou algo sobre o valor específico T ( n ) .kN,T(k)ckT(n)=O(n)TT(n)

Você precisa ser explícito sobre o que significa. Talvez sua prova seja:O

Suponha que para todos os k < n . Em seguida, T ( n ) = 2 T ( n / 2 ) + n 2 c n / 2 + n ( c + 1 )T(k)ckk<n .T(n)=2T(n/2)+n2cn/2+n(c+1)n

Isso não prova um passo indutivo: você começou com , e você provou que para k = n , T ( k ) ( c + 1 )T(k)ckk=n . Este é um limite mais fraco. Veja o que isso significa: T ( k ) cT(k)(c+1)k meios que C é um limite para a taxa de crescimento de t . Mas você tem uma taxa c que cresce quando k cresce. Isso não é um crescimento linear!T(k)ckcTck

Se você olhar atentamente, perceberá que a taxa aumenta 1 sempre que k dobrar. Então, informalmente, se m = 2 p k então c m = c k + p ; em outras palavras, c k = c 0 log 2 k .c1km=2pkcm=ck+pck=c0log2k

Isso pode ser feito com precisão. Prove por indução que para , T ( k ) c log 2 ( k ) .k1T(k)clog2(k)

A relação de recorrência é típica para algoritmos de dividir e conquistar que dividem os dados em duas partes iguais em tempo linear. Esses algoritmos operam em tempo (não S ( n ) ).Θ(nlog(n))O(n)

Para ver qual é o resultado esperado, você pode verificar a relação de recorrência contra o teorema mestre . A divisão é e o trabalho extra realizado é n ; log 2 ( 2 ) = 1, então este é o segundo caso para o qual o crescimento é Θ ( n2T(n/2)nlog2(2)=1 .Θ(nlog(n))


7

I'm extending the answer already given, perhaps only by explaining my comment in more detail.

Como a adivinhação pode ser claramente difícil e tediosa, às vezes existem métodos melhores. Um desses métodos é o Teorema dos Mestres . O nosso recorrência é agora a forma de , onde um 1 e b > 1 são constantes e f ( n ) uma função. Note-se que no nosso caso n / 2 pode ser interpretada no sentido de n / 2T(n)=aT(n/b)+f(n)a1b>1f(n)n/2n/2. Para ser tecnicamente exato, nossa recorrência pode não estar bem definida, pois pode não ser um número inteiro. No entanto, isso é permitido, uma vez que não afetará o comportamento assintótico da recorrência. Portanto, geralmente achamos conveniente soltar pisos e tetos. A prova formal disso é um pouco entediante, mas o leitor interessado pode encontrá-lo, por exemplo, no Cormen et al. livro .n/2

In our case, we have a=2, b=2, f(n)=Θ(n). This means that we have nlogba=nlog22=n. The second case of the Master theorem applies since f(n)=Θ(n), and we have the solution T(n)=Θ(nlogn).


Thanks! It may be noted that "dropping floors and ceils" corresponds to assuming that n=2k which is commonly done. The basic observation is that for non-decreasing functions, the asymptotic growth of subsequences equals the asymptotic growth of the whole sequence.
Raphael
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.