O(n*W)
ressemble à un temps polynomial, mais il est no c'est pseudo-polynôme .
La complexité temporelle mesure le temps que prend un algorithme en fonction de la taille de l'échantillon. longueur en bits de son entrée. La solution de programmation dynamique est en effet linéaire dans la valeur de W
mais exponentielle dans la longueur de W
- et c'est ce qui compte !
Plus précisément, la complexité temporelle de la solution dynamique pour la problème de sac à dos est essentiellement donnée par une boucle imbriquée :
// here goes other stuff we don't care about
for (i = 1 to n)
for (j = 0 to W)
// here goes other stuff
Ainsi, la complexité temporelle est clairement O(n*W)
.
Que signifie augmenter linéairement la taille de l'entrée de l'algorithme ? Cela signifie qu'il faut utiliser des tableaux d'éléments de plus en plus longs (donc n
, n+1
, n+2
...) et progressivement plus longues W
(donc, si W
es x
bits, après une étape, nous utilisons x+1
bits, alors x+2
bits, ...). Mais le valeur de W
croît de manière exponentielle avec x
L'algorithme n'est donc pas vraiment polynomial, il est exponentiel (mais il a l'air d'être polynomial, d'où le nom de "pseudo-polynomial").
Autres références
0 votes
Cette réponse de Quora utilise un exemple qui montre un raisonnement très clair qui vous conduit à une contradiction et à la compréhension de ce sujet.