Le temps de la Complexité de sac à Dos de la Programmation Dynamique de la solution
J'ai vu le récursive de la programmation dynamique solution à 0-1 problème de sac-à-Dos ici. Je memoized la solution et est venu avec le code suivant.
private static int knapsack(int i, int W, Map<Pair<Integer, Integer>>, Integer> cache)
{
if (i < 0) {
return 0;
}
Pair<Integer, Integer> pair = new Pair<>(i,W);
if (cache.contains(pair)) {
return cache.get(pair)
}
int result = -1;
if (weights[i] > W) {
result = knapsack(i-1, W);
} else {
result = Math.max(knapsack(i-1, W), knapsack(i-1, W - weights[i]) + values[i]);
}
cache.put(pair, result);
return result;
}
Quelqu'un peut m'expliquer pourquoi la complexité temporelle O(nW) où n est le nombre d'éléments et W est la restriction sur le poids.
Vous devez vous connecter pour publier un commentaire.
C'est plus évident si vous pensez à ce que le tableau pourrait ressembler à un tableau de mise en œuvre de la DP. Il comporte des points sur un axe et max réalisables poids sur l'autre, avec une ligne par possible nombre entier de poids. Pour certains jeux de poids, la table doivent être remplis afin de trouver la meilleure réponse. Ces mêmes jeux de poids exigera Omega(nW) paires dans votre mémo de hachage, ergo depuis chaque entrée est une constante de temps de calcul, le même temps de calculer tous les. C'est un bon exercice pour réfléchir à la façon d'obtenir le coût des jeux de poids, donc je vais laisser cela à vous.
Ouais, c'est une des raisons pour lesquelles je n'aime pas la récursivité. Vous pouvez presque toujours réécrire un algorithme récursif dans un qui utilise uniquement des boucles et pas la récursivité. Voici ce que votre algorithme ressemble avec boucles for seulement:
Ici, il est évident que la complexité est
O(nW)
. Je laisse à vous de comparer ce code avec le vôtre.Récursif algorithme de programmation dynamique peut être présenté par subproblem graphique.
Subproblem graphique est constitué de sommets ressemblant à des non-chevauchement des sous-problèmes. Et les arêtes orientées dans le sommet de représenter les appels récursifs. Les arêtes représentent en fait la dépendance de la sous-problèmes.
Généralement,
Pour sac-à-dos,
Outdegree de chaque sommet est à plus de 2=O(1). C'est parce que dans chaque subproblem, nous essayons de le résoudre en au plus deux façons.
Maintenant, si nous vérifions le sous-problèmes, on peut trouver un modèle,
Noter que pour chacun des
n
éléments, le poids peut varier à la plupart des1 to W
.(On peut comparer cette extension du modèle de la dynamique de Fibonacci problème modèle avec une dimension supplémentaire.)
Donc il y a au plus
n*W
unique sous-problèmes.Et que nous avons à résoudre chaque subproblem qu'une seule fois,
Le temps d'exécution = O(1)O(nW) = O(n*M).
Complexité temporelle est près de O(nlogn)