Complexité temporelle de l'addition


11

Wikipedia répertorie la complexité temporelle de l'addition comme n , où n est le nombre de bits.

S'agit-il d'une borne inférieure théorique rigide? Ou est-ce simplement la complexité de l'algorithme connu le plus rapide actuellement. Je veux savoir, car la complexité de l'addition souligne toutes les autres opérations arithmétiques et tous les algorithmes qui les utilisent.

Est-il théoriquement impossible d'obtenir un algorithme d'addition qui s'exécute en o(n) ? Ou sommes-nous liés à une complexité linéaire pour l'addition.

Réponses:


17

Si votre algorithme utilise asymptotiquement moins de fois, il n'a pas assez de temps pour lire tous les chiffres des nombres qu'il ajoute. Vous devez imaginer que vous manipulez de très grands nombres (stockés par exemple dans des fichiers texte de 8 Mo). Bien sûr, l'addition peut se faire très rapidement par rapport à la valeur des nombres; il s'exécute en temps O ( log ( N ) ) , si N est la valeur de la somme.nO(Journal(N))N

Cela ne signifie pas que vous pouvez accélérer un peu les choses; si votre processeur gère 32 bits à chaque opération, alors vous utilisez fois, mais c'est toujoursO(n)et nono(n).n32O(n)o(n)


Lire toutes les données théoriquement nécessaires. Pour l'addition de deux nombres et b , a : a b , a + b 2 a . Le calcul de 2 a peut être effectué en fonctionnement O ( 1 ) , par décalage. Ajout d'un 0 . Considérez cela. Si vous ne trouvez pas une estimation plus rapide de la somme, affinez cette estimation jusqu'à ce qu'elle soit correcte. En moins de n opérations? uneb,une:uneb,une+b2une2uneO(1)0n
Tobi Alafin

3
Oui, c'est une nécessité théorique, car: chaque bit de l'entrée est utilisé de manière non triviale dans la sortie , où par non trivial, je veux dire que ce n'est pas la fonction d'identité. Dans votre exemple , si 2 a peut être calculé en temps O ( 1 ) dépend du modèle de calcul: si l'ajout d'un 0 est une opération à temps constant, alors oui. Si vous avez accès à la RAM, vous avez besoin de O ( log ( n ) ) pour écrire l'adresse du bit si vous connaissez déjà la longueur de a , ou O ( n )2une2uneO(1)0O(Journal(n))uneO(n)temps si vous devez lire tout pour le savoir. Dans ce 2 un exemple, le nombre de bits de sortie sont des fonctions triviales de bits d'entrée. une2une
Lieuwe Vinkhuijzen

J'ai un algorithme qui trouve la longueur d' dans O ( log n ) . Il utilise la recherche binaire. uneO(Journaln)
Tobi Alafin

3
@TobiAlafin Si votre modèle prend en charge l'adressage RAM, votre recherche binaire s'exécute par étapes , corrigez. Sur Turing Machine, et dans un fichier texte non chargé dans la mémoire principale, cela prend du temps O ( n ) . Dans les deux cas, pour répondre à votre question, avec ou sans adressage RAM pour accélérer la recherche, votre algorithme devra regarder tous les bits de l'entrée pour calculer a + b . Supposons qu'il ne l'ait pas fait, et sur une entrée de 42 bits, il n'inspecte pas le 6e bit. Ensuite, je pourrais retourner ce bit, et cela donnerait la mauvaise réponse. O(Journaln)O(n)une+b426
Lieuwe Vinkhuijzen

1
Ω(n)

7

Pour que l'analyse de complexité ait un sens formel, vous devez spécifier un modèle de calcul formel dans lequel l'algorithme dans l'objet est exécuté, ou, à tout le moins, un modèle de coût , qui spécifie quelles sont les opérations de base et leurs coûts.

Θ(1)

Θ(|X|)

Maintenant, les opérations peuvent-elles avoir un coût inférieur à cela? Cependant, vous devrez peut-être définir formellement un modèle de calcul dans lequel cela peut se produire.


1
Θ(Journaln)n

3

Ω(n)

Imaginez que votre algorithme ajoute avec succès 1010100110 et 0010010110 sans lire chaque bit. Pour que votre algorithme puisse ajouter des entrées arbitraires , je devrais être capable de retourner aléatoirement n'importe lequel de ces bits, et l'algorithme génère toujours une addition correcte (mais différente). Mais si votre algorithme ne lit pas tous les bits, comment pourrait-il dire que l'entrée inversée était différente de l'entrée d'origine?


n

Absolument. Il vous suffit de définir ce que signifie "approximatif" dans votre algorithme. Selon cette définition, l'ajout des deux bits les plus significatifs pourrait être une somme approximative, ce qui pourrait être fait en temps o (n) . Lorsque vous mentionnez l'algorithme "addition", je pense que nous considérons tous que cela signifie que la réponse doit être exacte.
murrdpirate
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.