Resolvendo relação de recorrência com duas chamadas recursivas


10

Estou estudando o pior caso de execução do quicksort, sob a condição de que ele nunca fará uma partição muito desequilibrada para definições variadas de very .

Para fazer isso, pergunto-me qual seria o tempo de execução , caso o quicksort sempre particione em alguma fração tal forma que estão na partição esquerda e estão na partição direita (deixando elemento, o pivô, no meio).T(n,p)0<p≤12⌊p(n−1)⌋⌈(1−p)(n−1)⌉1

Não deve ser difícil perceber que fornece um limite superior para o pior caso em que é a partição permitida desbalanceada máxima, pois qualquer partição com fração será mais equilibrada e terá um tempo de execução menor, e qualquer fração não é permitida.T(n,p)p>p<p

É óbvio que é o melhor caso e é o pior caso de quicksort. Ambos têm relações de recorrência fáceis encontradas em qualquer recurso educacional. Mas não tenho idéia de como estudar em geral. A relação óbvia seria:T(n,12)T(n,0)T(n,p)

T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)

Aqui eu fico preso. Eu tentei pesquisar, mas toda a literatura que eu pude entender sobre os algoritmos de dividir e conquistar levou a "dividir" literalmente e "enganou" a análise usando o fato de que as partições são sempre iguais em tamanho, mesclando os termos uma vez por vez. constante.

Não sei como lidar com duas chamadas recursivas e não sei se é seguro remover o arredondamento. É possível resolver analiticamente e, em caso afirmativo, como?

PS: Não estou interessado em assintóticos (o que é fácil de mostrar para qualquer constante ). Estou interessado em quanto o quicksort mais lento se torna quando fica menor, por exemplo, estou interessado na razão .p p T ( n , 0,25 )Θ(nlog⁡n)ppT(n,0.25)T(n,0.5)

PPS: Como estudante de graduação, peço desculpas se fiz coisas óbvias por não trivialidades muito longas ou subexplicadas. E, embora eu não saiba se isso aqui é menos visto em outros sites da SE, observarei que isso é interesse pessoal, não lição de casa.

Respostas:


9

Como você mencionou, o teorema de Akra – Bazzi mostra que a solução para a recorrência é para todos os . No entanto, isso não revela a natureza da dependência da . Para determinar o último, podemos usar uma abordagem de árvore de recursão.O ( n log n ) p ∈ ( 0 , 1 ) pT(n,p)O(nlog⁡n)p∈(0,1)p

Na raiz da árvore de recursão está o intervalo . Seus dois filhos são os intervalos e , cujo comprimento total é novamente . Cada um desses nós tem dois filhos (assumindo que é grande o suficiente) e assim por diante. Por simplicidade, ignoramos os erros de arredondamento, ou seja, assumimos que é um número inteiro; isso é apenas um detalhe técnico, e eu não me preocuparia com isso. Paramos o processo sempre que um nó tiver comprimento no máximo . A complexidade do algoritmo é proporcional à duração total dos intervalos na árvore. Quando , as folhas{ 1 , ... , p n } { p n + 1 , ... , n } n n p n 1 p ≠ 1 / 2{1,…n}{1,…,pn}{pn+1,…,n}nnpn1p≠1/2 (nós nos quais paramos o processo) têm diferentes profundidades e isso dificulta a determinação da complexidade geral.

Podemos obter um limite superior simples observando que a árvore possui no máximo níveis: cada nó é pelo menos um fator menor que seu pai. Assim como na análise para , a duração total dos intervalos em qualquer nível é no máximo , e obtemos um limite superior de no tempo de execução. Como e para pequeno , podemos escrever isso como .1 - p p = 1 / 2 N O ( n log 1 - P ( 1 / n ) ) log 1 - P ( 1 / n ) = log n / log ( 1 - P ) - 1 log ( 1 - p ) - 1log1−p⁡(1/n)1−pp=1/2nO(nlog1−p⁡(1/n))log1−p⁡(1/n)=log⁡n/log⁡(1−p)−1p O ( n log n / p )log⁡(1−p)−1=−log⁡(1−p)=p±O(p2)pO(nlog⁡n/p)

Aqui está um cálculo mais preciso. Considere o nível . Suponha que não paremos o processo ao atingir um pequeno intervalo. Podemos gerar um vértice aleatório executando etapas, em cada uma das quais vamos para a esquerda (digamos) com probabilidade e direita (digamos) com probabilidade . Cada vez que damos um passo à esquerda, o log da duração do intervalo diminui em , e cada vez que damos um passo à direita, diminui em . Um vértice está na árvore real do log do comprimento diminuído no máximo . O peso total dos intervalos no nívelttp1−p−log⁡p−log⁡(1−p)log⁡ntda árvore é exatamente a probabilidade de um vértice gerado de acordo com esse processo corresponder a uma diminuição de no máximo . Ou seja, se é a distribuição que é igual a com probabilidade e para com probabilidade , e são independentes, então o o peso total do nível é . Para a super constante , a variável aleatória é normalmente distribuída normalmente com média variação linear emlog⁡nD−log⁡pp−log⁡(1−p)1−pX1,…,Xt∼DttPr[X1+⋯+Xt≤log⁡n]t [ - p log P - ( 1 - P ) log ( 1 - P ) ] t t t [ - p log P - ( 1 - P ) log ( 1 - P ) ] t ≤ ( log n ) / 2 1 t [ - p logX1+⋯+Xt[−plog⁡p−(1−p)log⁡(1−p)]tt, portanto, para satisfazer , digamos, a probabilidade será muito próxima de , enquanto que para satisfazendo , por exemplo, será muito próximo de zero. Definindo (conhecida como função de entropia binária), concluímos que o tempo de execução é (uniforme em , como ). Como , temos e, portanto, nossa estimativa anterior não era rígida.t[−plog⁡p−(1−p)log⁡(1−p)]t≤(log⁡n)/21th ( p ) = - p log p - ( 1 - p ) log ( 1 - p ) Θ ( n log n / h ( p ) ) p n → ∞ p → 0 h ([−plog⁡p−(1−p)log⁡(1−p)]t≥2log⁡nh(p)=−plog⁡p−(1−p)log⁡(1−p)Θ(nlog⁡n/h(p))pn→∞p→0h(p)≈−plog⁡p

Outra forma de olhar para a mesma análise é por ter uma sequência infinita de variáveis aleatórias independentes como antes, e definindo um tempo de paragem de ser a primeira vez que de tal modo que . O tempo de execução é proporcional a . O teorema da renovação elementar afirma então que , implicando que o o tamanho total dos intervalos é igual a . Mais precisamente, para cada constante o tamanho total dos intervalos é , em queT t X 1 + ⋯ + X t ≥ log n n E [ T ] lim n → ∞ E [ T ] / log n = 1 / E [ D ] = 1 / h ( p ) ( 1 + o ( 1 ) ) n log nX1,X2,…TtX1+⋯+Xt≥log⁡nnE[T]limn→∞E[T]/log⁡n=1/E[D]=1/h(p)p ( 1 + α p ( n ) ) n log n / h ( p ) α p ( n ) = o ( n ) log n n α p ( n ) = O ( n - C p ) p ∈ ( δ , 1 - δ ) δ > 0(1+o(1))nlog⁡n/h(p)p(1+αp(n))nlog⁡n/h(p)αp(n)=o(n) . A convergência no teorema da renovação elementar é exponencial no parâmetro de tempo - no nosso caso -, portanto, deve ser polinomial em , ou seja, . A convergência também é provavelmente uniforme para para qualquer .log⁡nnαp(n)=O(n−Cp)p∈(δ,1−δ)δ>0


Resumindo, o comprimento total dos intervalos na árvore de recursão, proporcional ao tempo de execução, é da seguinte forma para cada : onde e são levados para a mesma base e é uma função dependendo de tendendo a com .T ( n , p ) = ( 1 + o ( 1 ) ) n log nplognh(p)=-plogp-(1-p)log(1-p)o(1)p0n

T(n,p)=(1+o(1))nlog⁡nh(p),
log⁡nh(p)=−plog⁡p−(1−p)log⁡(1−p)o(1)p0n

Além disso, provavelmente é verdade que, para qualquer e qualquer , é verdade que o comprimento total dos intervalos é da forma que e a grande constante O oculta dependem apenas de . Em particular, deve ser o caso de todas as constantes , e a convergência é polinomialmente rápida.δ>0p∈(δ,1−δ)

T(n,p)=(1+O(n−Cδ))nlog⁡nh(p),
Cδ>0δp1,p2
limn→∞T(n,p1)T(n,p2)=h(p2)h(p1),

Obrigado pela sua resposta rápida Yuval. Estou um pouco confuso pelo fato de você ter usado no seu resumo. é uma constante, e isso não significa que é irrelevante em ? Decidi escrever um pequeno programa de teste , que mostrou que para comparando entre o método analítico e o computacional, deu um erro de 0,03. Isso parece bastante amplo ou isso é esperado? Θh(p)Θn=100000000000000T(n,0.1)/T(n,0.5)
— orlp

A constante em é uniforme na . Mais precisamente, para algumas constantes é o caso que, para cada existe tal que para , . Você provavelmente pode obter uma declaração ainda mais forte da forma para cada fixo , onde o pequeno o é em relação a ( mas poderia depender de ); não deve depender da . Θpc,CpNpn≥Npcnlog⁡n/h(p)≤T(n,p)≤Cnlog⁡n/h(p)p n p C pT(n,p)=(1+o(1))Cnlog⁡n/h(p)pnpCp
— Yuval Filmus 14/10

A convergência para o limite depende de ; portanto, é necessário que seja grande para obter uma boa aproximação. Por outro lado, um erro relativo de 0,03 não parece tão grande. Você pode tentar fixar e plotar o tempo de execução em função de , comparando-o com . log n n p 1 / h ( p )log⁡nlog⁡nnp1/h(p)
— Yuval Filmus 14/10

Oh, desculpe, não quis dizer um erro relativo de 0,03, mas um erro absoluto (2,13222 vs 2,10339). A plotagem de em função de , relativa a deu uma diferença relativa de 4%, com sendo 96% de . p 1 / h ( p ) T ( 10 11 , 0,05 ) ∗ h ( 0,05 ) T ( 10 11 , 0,4 ) ∗ h ( 0,4 )T(n,p)p1/h(p)T(1011,0.05)∗h(0.05)T(1011,0.4)∗h(0.4)
— orlp

11
Super constante é uma função que tende ao infinito em relação à variável relevante (neste caso, ). É o mesmo que . ω ( 1 )nω(1)
— Yuval Filmus 14/10
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.