Question: Étant donné un -bit nombre naturel , comment calculer en utilisant seulement ajouts et changements (bits)?
L'astuce consiste à utiliser la recherche binaire. Cependant, je n'ai pas pu atteindre la complexité requise (j'ai obtenu ).
Qu'est-ce que cela signifie par using only $O(n)$ (bit) additions and shifts
:
Il s'agit d'un exercice dans un livre d'algorithmes.
À mon avis, cela signifie que l'ajout de deux nombres naturels , disons bits, coûte et le déplacement d'un nombre naturel , disons bits, coûte également . Ensuite , nous sommes seulement autorisés à utiliser ces opérations fois.
Il ne mentionne pas le coût de la comparaison. Je suppose que nous pouvons l'ignorer ou supposer que la comparaison de deux nombres naturels , disons bits, coûte également .
Mon algorithme :
- Déterminez la plage du nombre de bits de :
Par conséquent,
- Recherche binaire: recherchez entre et aide de la recherche binaire. Pour chaque nombre , pour calculer en utilisant des additions et des décalages comme primitives et le comparer avec .
La complexité est donc pour fois de recherche binaire et de calcul , chacun prenant à son tour additions et décalages.
la source
Parlons-nous d'entiers ici? Où N est long de n bits?
La boucle est effectuée n / 2 fois, ce qui devrait vous donner des performances O (n)
Edit: Comment ça marche, & pourquoi?
Il s'agit d'une version de Successive Approximation, également utilisée dans les algorithmes CORDIC.
En commençant par le plus petit bit possible (avec un carré inférieur à N), vous définissez un bit à la fois et calculez le nouveau carré.
Si le nouveau carré est toujours inférieur à N, conservez le bit tel qu'il est défini.
Si le nouveau carré est trop grand, effacez le bit, annulez l'effet de l'ajout et passez au bit suivant.
Exemple: N = 441 (1 1011 1001 binaire), n = 9
la source
La principale méthode consiste à remplir les bits de de gauche à droite tout en gardant notre estimation ci - dessous, ou plutôt la place de notre estimation ci - dessous . Chaque bit est une puissance de 2, donc la mise au carré ou la multiplication d'un autre nombre par est toujours un décalage de bit.N--√ N b b
Si l'estimation actuelle est , , et que nous connaissons déjà a , nous obtenons , et nous pouvons réécrire les deuxième et troisième termes comme et . Nous ajoutons ensuite tout et test (je suppose que vous pouvez faire ) et régler le bit si le carré est toujours inférieur .une b =2je une2 ( a + b)2=une2+ 2 a b +b2 un < < ( i + 1 ) 1 < < ( i < < 1 ) < je N
Nous commençons la boucle à et comptons jusqu'à zéro, en gardant et fur et à mesure. C'est une sorte de recherche binaire, mais où les limites correspondent à des différences sur un seul bit.i = n / 2 = n > > 1 une une2
la source
J'aime la réponse d'Alan Campbell : avec un suivi attentif des suppositions précédentes, la nouvelle soustraction est facile à chaque fois, et la racine carrée de décalage et d'ajout binaire est à peu près aussi rapide qu'une division de décalage et d'ajout binaire.
Mais il peut être possible d'aller plus vite, au lieu de faire de votre prochaine supposition un seul chiffre binaire, au lieu d'utiliser un algorithme "Ab" x "Ab", et de faire de votre prochaine supposition la moyenne de votre supposition précédente, et le nombre d'origine divisé par la supposition précédente. Cela semble que cela prendrait plus de temps, pas plus court. Cependant, la division ne doit pas être exacte. Donc, si la division ne s'exécute qu'à la racine carrée du nombre de chiffres restant à trouver, vous pourriez en fait gagner du temps. De plus, si pour votre division vous utilisez la méthode française, de la division sténographique, alors vous pourriez réellement casser une certaine vitesse dans votre calcul pour de très grandes divisions.
Maintenant, si nous ajoutons des calculs en parallèle qui donnent des résultats préliminaires corrigibles avant que la réponse ne soit trouvée ... alors nous pourrions être sur quelque chose.
la source