Qual é a complexidade de uma pesquisa entre parênteses usando intermediários?

8

Estou tentando estimar a complexidade de um algoritmo que escrevi para o descompilador Reko , onde estou tentando "desfazer" a transformação de um compilador em uma divisão inteira por uma constante . O compilador converteu a divisão em uma multiplicação de números inteiros e uma mudança: , em quex/n(x2β/n)>>ββ é o número de bits da palavra-máquina do computador. A multiplicação constante resultante é muito mais rápida que uma divisão na maioria das arquiteturas contemporâneas, mas não se parece mais com o código original.

Para ilustrar: a instrução C

y = x / 10;

será compilado pelo compilador Microsoft Visual C ++ para a seguinte linguagem assembly

mov edx,1999999Ah  ; load 1/10 * 2^32 
imul eax           ; edx:eax = dividend / 10 * 2 ^32 
mov eax,edx        ; eax = dividend / 10

O resultado líquido é que o registro eaxagora terá o valor esperado a ypartir do código-fonte.

Um descompilador ingênuo descompilará o acima

eax = ((long)eax * 0x1999999A) >> 32;

mas Reko pretende tornar a saída resultante mais legível do que a recuperando a constante usada na divisão original.

O algoritmo sugerido acima é baseado na descrição deste artigo na Wikipedia . Primeiro, o algoritmo trata o multiplicador constante como o valor recíproco em escala2β/n. Ele converte isso em um número de ponto flutuante2βrf e depois reduz a escala 2β para rf, Onde 0.0<rf<1.0. A etapa final e cara é colocar o valor do ponto flutuante entre parêntesesrf entre dois números racionais a/b, c/d(começando com 0/1 e 1/1) e calcule repetidamente o mediant (a+c)/(b+d)até que algum critério de convergência seja alcançado. O resultado deve ser a "melhor" aproximação racionalr ao recíproco rf.

Agora, se o bracketing estivesse sendo feito com uma pesquisa binária típica iniciando entre os racionais 0/2β e 2β/2βe computando o ponto médio (a/b+c/d)/2, Espero que o algoritmo converja O(β)passos. Mas qual é a complexidade do algoritmo se a mediante for usada?

John Källén
fonte
@DW Eu editei a questão de explicar o que quero dizer com "desfazer"
John Kallen
Obrigado! Não é uma resposta para sua pergunta específica, mas você está familiarizado com as frações contínuas? Eles são outra maneira de encontrar uma boa aproximação racional a um determinado número de ponto flutuante. Eles são muito eficientes e suspeito que possam funcionar bem em seu ambiente (pois encontram todas as aproximações racionais "muito boas", para uma definição adequada de "muito bom").
DW
@ DW Estou familiarizado apenas com frações contínuas. Existe um algoritmo de aproximação que converge em uma solução em O (log n)?
John Källén 17/04

Respostas:

4

A relação entre a árvore de Stern – Brocot e as seqüências de Farey mostra que, se 0<p/q<1 e (p,q)=1 (ou seja, p/q é uma fração reduzida) então p/q é no qth nível da árvore. Como o prazo de execução do seu algoritmo é linear no nível em que você termina, seu algoritmo leva tempoO(q), Onde p/qé a resposta; mas isso não é tão útil.

Você não especificou qual é o seu critério de parada, mas presumivelmente você tem algum limite de erro ϵ. Portanto, a pergunta é para qual sequência de Farey é que os termos adjacentes estão à distância, no máximo.2ϵ (e todos os pontos estão à distância ϵde algum ponto). Usando o fato de que a distância entre frações adjacentesp1/q1,p2/q2 em uma sequência do Farey é 1/(q1q2), não é difícil mostrar que a distância máxima na qa sequência Farey é 1/q. Portanto, se você está buscando uma distância deϵ, seu algoritmo será executado a tempo O(1/ϵ) no pior dos casos.

Entretanto, "a maioria" de frações adjacentes no qA sequência do Farey está à distância O(1/q2)e, portanto, em média, você provavelmente esperaria um tempo de execução de O(1/ϵ) (infelizmente, essa média é mais relativa à entrada do que ao algoritmo).

Yuval Filmus
fonte
Portanto, parece que o ponto médio converge como O (log1 / e) enquanto os intermediários convergem como O (sqrt (1 / e)). Que decepção.
John Källén 15/04