Pergunta: Dada umanúmero natural bits , como calcular usando apenas adições e turnos de (bit)?
A dica é usar a pesquisa binária. No entanto, não consegui atingir a complexidade necessária (obtive ).
O que isso significa por using only $O(n)$ (bit) additions and shifts
:
Este é um exercício em um livro de algoritmos.
Na minha opinião, significa que adicionar dois números naturais , digamos bits, custa e mudar um número natural digamos bits, também custa . Então, só podemos usar essas operações vezes.
Não menciona o custo da comparação. Acho que podemos ignorá-lo ou assumir que comparar dois números naturais , digamos bits, também custa .
Minhas algoritmo :
- Determinar o intervalo do número de bits do :
Portanto,
- Pesquisa binária: Encontre entre e usando a pesquisa binária. Para cada número , para calcular usando adições e desvios quanto primitivas e compará-lo com .
A complexidade é, portanto, para tempos de pesquisa binária e computação , cada um dos quais, por sua vez, recebe adições e turnos.
fonte
Estamos falando de números inteiros aqui? Onde N tem n bits?
O loop é executado n / 2 vezes, o que deve fornecer desempenho de O (n)
Edit: Como funciona, e por quê?
Esta é uma versão da Aproximação sucessiva, que também é usada nos algoritmos CORDIC.
Começando com o maior bit único possível (com um quadrado menor que N), você define um bit de cada vez e calcula o novo quadrado.
Se o novo quadrado ainda for menor que N, mantenha o bit definido.
Se o novo quadrado for muito grande, limpe o bit, desfaça o efeito de adicioná-lo e passe para o próximo bit.
Exemplo: N = 441 (10111001 binário), n = 9
fonte
O método principal é preencher os bits deN--√ da esquerda para a direita, mantendo a estimativa abaixo, ou melhor, o quadrado da estimativa abaixo N . Cada bitb é uma potência de 2, portanto, ao quadrado ou multiplicação de outro número por b é sempre um pouco de mudança.
Se a estimativa atual foruma , b =2Eu e nós sabemos uma2 já temos ( a + b)2=uma2+ 2 a b +b2 , e podemos reescrever o segundo e o terceiro termos como um < < ( i + 1 ) e 1<<(i<<1) . Em seguida, adicionamos tudo e testamos (presumo que você possa fazer< ) e definir bit i se o quadrado ainda estiver abaixo N .
Começamos o ciclo emi=n/2=n>>1 e conte até zero, mantendo a e a2 como nós vamos. É um tipo de pesquisa binária, mas onde os limites são mapeados para diferenças de bit único.
fonte
Gosto da resposta de Alan Campbell : com o rastreamento cuidadoso de suposições anteriores, a nova subtração é fácil a cada vez, e a raiz quadrada de troca e adição de binário é quase tão rápida quanto uma divisão de troca e adição de binário.
Mas pode ser possível ir mais rápido, ao invés de tornar sua próxima tentativa um único dígito binário, usando um algoritmo "Ab" x "Ab" e fazendo sua próxima tentativa a média da sua tentativa anterior e o número original dividido pelo palpite anterior. Parece que demoraria mais, não mais. No entanto, a divisão não precisa ser exata. Portanto, se a divisão for executada apenas na raiz quadrada do número de dígitos restantes a ser encontrado, você poderá economizar tempo. Além disso, se para a sua divisão você usar o método francês, da divisão taquigráfica, poderá realmente quebrar alguma velocidade no seu cálculo para grandes divisões.
Agora, se somarmos cálculos em paralelo que produzem resultados preliminares corrigíveis antes que a resposta seja encontrada ... então podemos entender alguma coisa.
fonte