Calculer la valeur de x ^ y en O(log n)
Question d'entrevue:
Calculer x ^ y en O(log n)
Il y a différentes réponses comme "l'Utilisation de l'Indien de la Puissance de l'algorithme" ou
double power(double x, int y)
{
if(y == 0) return 1;
double d = power(x, y/2);
if(y%2 == 0) return d*d;
else return x*d*d;
}
- est-il une bonne réponse?
- est-il une meilleure façon d'écrire un code pour cette question?
Est-ce devoirs?
non, c'est une question d'entrevue, vous pouvez voir le tag 😉
le reste est redondant
non, c'est une question d'entrevue, vous pouvez voir le tag 😉
le reste est redondant
OriginalL'auteur Elnaz | 2012-04-17
Vous devez vous connecter pour publier un commentaire.
Ce qui est appelé L'Exponentiation par la Quadrature. Aussi loin que la mise en œuvre va, c'est une question de goût. Votre récursive de la mise en œuvre est bonne, mais non récursive implémentations (à partir du lien ci-dessus) peut paraître un peu plus propre pour les gens qui n'aiment pas la récursivité ou de croire, à tort, qu'il est en quelque sorte le "gaspillage" ou "lent".
OriginalL'auteur dasblinkenlight
Des Questions sur les opérations mathématiques de base, et des questions sur la complexité de calcul, sont généralement traitées rapidement par Wikipedia.
L'Exponentiation: Calcul efficace de l'ensemble des pouvoirs
OriginalL'auteur Potatoswatter
Nous allons analyser:
power
est appelée (par l'intermédiaire de la récursivité) autant de fois que l'originaly
est divisible par 2 (c'est le plus grand nombre,k
, tels que2^k < y
). Cela signifie que le nombre de calculs est à peu prèsk=log_2(2^k)=log_2(y)~=log(y)
, donc c'est une bonne réponse.La réponse à la "meilleure façon" dépend de ce qui est considéré comme "meilleur"
OriginalL'auteur Attila
Voici la façon de le faire:
disons que vous voulez à 2^1024, ... wait for it ... 11 multiplications
vous le faire de cette façon
donc, fondamentalement, il vous suffit d'écrire votre exposant en base 2 et d'obtenir toutes les multiplications
OriginalL'auteur scibuff
Ici est beaucoup plus rapide:
%
est une opération très coûteuse, pour la remplacer par une opération au niveau du bit est une des économies considérables; aussi remplacery/2
avecy>>1
:x%2
est universellement optimisé pourx&1
, et de la même façon avecx/2
etx>>1
. Microoptimizations ne sont pas une bonne idée, sauf si vous êtes à la résolution d'un problème découvert en lisant le démontage. Tout cela permet d'accomplir est d'utiliser le mauvais opérateurs pour le travail, rendant les règles de priorité encore plus tordu. Par exemple,(y&1 == 0)
ne fait pas ce que vous pensez que cela fonctionne.Alors que je suis totalement d'accord avec @Potatoswatter, je voudrais ajouter que
if(y&1)
est également possible (malgré le mauvais dans certains styles de code) 😀D'autre part, dans certains contextes, l'écriture
>> 1
est plus évident que/ 2
et a même distincte de la sémantique, par exemple en PHP où/
flotter division et>> 1
jette les opérandes entiers.OriginalL'auteur kasavbere