Si vous êtes ici, il y a de fortes chances que vous essayiez de résoudre le « problème du sous-réseau Maximum” et que vous rencontriez L’algorithme de Kadane mais que vous ne puissiez pas comprendre comment fonctionne quelque chose comme ça. Ou peut-être que vous étiez fatigué d’utiliser L’algorithme de Kadane comme une « boîte noire”. Ou peut-être vouliez-vous comprendre l’aspect de la programmation dynamique. Ou peut-être que vous voulez juste en apprendre davantage sur un nouveau concept qui peut vous rendre meilleur dans la programmation. Quelle que soit la raison, vous avez frappé à la bonne place.,

pour mieux comprendre L’algorithme de Kadane, nous allons d’abord passer par une brève introduction de la programmation dynamique. Ensuite, nous examinerions un problème de programmation très populaire, le problème Maximum Subarray. Nous verrons comment ce problème peut être résolu en utilisant une approche par force brute, puis nous essaierons d’améliorer notre approche et de trouver un meilleur algorithme, alias L’algorithme de Kadane.

Donc, nous allons entrer.,

programmation dynamique

La Programmation dynamique est une méthode pour résoudre un problème complexe en le décomposant en une collection de sous-problèmes plus simples, en résolvant chacun de ces sous-problèmes une seule fois et en stockant leurs solutions à l’aide d’une structure de données basée sur la mémoire (tableau, carte, etc.). Ainsi, la prochaine fois que le même sous-problème se produit, au lieu de recalculer sa solution, on recherche simplement la solution précédemment calculée, économisant ainsi du temps de calcul.

ceux qui ne se souviennent pas du passé sont condamnés à le répéter., – Programmation dynamique

Voici une explication brillante sur le concept de programmation dynamique sur Quora-la réponse de Jonathan Paulson à Comment dois-je expliquer la programmation dynamique à un enfant de 4 ans?

bien qu’il y ait plus à la programmation dynamique, nous irons de l’avant pour comprendre le problème du sous-réseau Maximum.

problème de sous-réseau Maximum

le problème de sous-réseau maximum est la tâche de trouver la plus grande somme possible d’un sous-réseau contigu, dans un tableau unidimensionnel donné A de nombres.,

Montant Maximum Subarray (En Jaune)

Par exemple, pour le tableau donné ci-dessus, la zone contiguë subarray avec la somme la plus importante est que , avec la somme de 6. Nous utiliserions ce tableau comme exemple pour le reste de cet article. En outre, nous supposerions que ce tableau est indexé à zéro, c’est-à-dire que -2 serait appelé comme élément ‘0th’ du tableau et ainsi de suite. En outre, A représenterait la valeur à l’indice I.,

maintenant, nous examinerions une solution très évidente au problème donné.

approche par force Brute

Une solution très évidente mais pas si bonne consiste à calculer la somme de tous les sous-réseaux possibles et le maximum de ceux-ci serait la solution. Nous pouvons commencer à partir de l’indice 0 et calculer la somme de chaque sous-tableau possible en commençant par L’élément A, comme indiqué dans la figure ci-dessous. Ensuite, nous calculerions la somme de chaque sous-tableau possible en commençant par A, A et ainsi de suite jusqu’à A, Où n désigne la taille du tableau (n = 9 dans notre cas)., Notez que chaque élément est un sous-tableau lui-même.

approche par force Brute: itération 0 (à gauche) et itération 1 (à droite)

nous appellerons la somme maximale des sous-réseaux commençant par l’élément a le local_maximum à l’Index I. ainsi, après avoir parcouru tous les indices, il nous resterait local_maximum pour tous les indices. Enfin, nous pouvons trouver le maximum de ces local_maximums et on obtient la solution finale, c’est à dire, la somme maximale possible. Nous appellerions cela le global_maximum.

Mais vous remarquerez peut-être que ce n’est pas une très bonne méthode car à mesure que la taille du tableau augmente, le nombre de sous-réseaux possibles augmente rapidement, augmentant ainsi la complexité de calcul. Ou pour être plus précis, si la taille du tableau est n, alors la complexité temporelle de cette solution est O(n2) ce qui n’est pas très bon.

Comment Pouvons-nous améliorer cela? Existe-t-il un moyen d’utiliser le concept de programmation dynamique? A nous de trouver.,

algorithme de Kadane

dans cette section, nous utiliserions à nouveau l’approche de la force brute discutée ci-dessus, mais cette fois nous recommencerions en arrière. Comment aurait-il m’aider? Voyons voir.

nous partirions du dernier élément et calculerions la somme de chaque sous-tableau possible se terminant par L’élément A, comme indiqué dans la figure ci-dessous. Ensuite, nous calculerions la somme de chaque sous-tableau possible se terminant par A, A et ainsi de suite jusqu’à A.,

Arrière Approche par Force Brute: l’Itération 0 (à gauche) et à l’Itération 1 (à droite)

Maintenant, concentrons-nous sur les sous-réseaux se terminant avec l’élément A (=-1) et A (=2) illustré dans la figure ci-dessous.,

à Partir de la figure ci-dessus, nous voyons que la local_maximum est égal à 3, qui est la somme de la subarray . Maintenant, regardez les sous-rangées se terminant par A. Vous remarquerez que ces sous-rangées peuvent être divisées en deux parties, les sous-rangées se terminant par A (surligné en jaune) et le sous-rangée à un seul élément A (en vert).

disons que je connais le local_maximum., Ensuite, nous voyons que pour calculer le local_maximum, nous n’avons pas besoin de calculer la somme de tous les sous-réseaux se terminant par A puisque nous connaissons déjà le résultat des tableaux se terminant par A. notez que si array avait la somme maximale, il suffit de vérifier les tableaux mis en évidence avec les flèches rouges pour calculer local_maximum. Et cela nous conduit au principe sur lequel fonctionne L’algorithme de Kadane.

local_maximum à l’indice i est le maximum de A et la somme de A et de local_maximum index i-1.,

en Utilisant la méthode ci-dessus, nous avons besoin de parcourir le tableau juste une fois, ce qui est beaucoup mieux que la précédente approche par force brute. Ou pour être plus précis, la complexité temporelle de L’algorithme de Kadane est O(n).

enfin, voyons comment tout cela fonctionnerait dans le code.,

procédure pas à pas du Code

ci-dessous est une implémentation très explicite (en C++) d’une fonction qui prend un tableau comme argument et renvoie la somme du sous-tableau maximum.

Notez qu’au lieu d’utiliser un tableau pour stocker local_maximums, nous sommes tout simplement de stocker la dernière local_maximum dans une variable de type int ‘local_max  » parce que c’est ce que nous avons besoin de calculer les prochains local_maximum., De plus, comme nous utilisons une variable ‘global_max’ pour garder une trace de la valeur maximale de local_maximum, qui à la fin s’avère être la sortie requise.

Conclusion

en raison de la façon dont cet algorithme utilise des sous-structures optimales (le sous-tableau maximum se terminant à chaque position est calculé de manière simple à partir d’un sous-problème connexe mais plus petit et se chevauchant: le sous-tableau maximum se terminant à la position précédente), cet algorithme peut, L’algorithme de Kadane est capable de trouver la somme maximale d’un sous-réseau contigu dans un tableau avec un runtime de O(n).

Articles

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *