Un problème plus simple consiste à trouver la longueur de la plus longue sous-séquence croissante. Vous pouvez vous concentrer sur la compréhension de ce problème en premier lieu. La seule différence de l'algorithme est qu'il n'utilise pas la fonction P le tableau.
x est l'entrée d'une séquence, elle peut donc être initialisée comme : x = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
m garde la trace de la meilleure sous-séquence de chaque longueur trouvé jusqu'à présent. La meilleure est celle dont la valeur finale est la plus petite (ce qui permet d'ajouter un plus grand nombre de valeurs après elle). La longueur et la valeur finale sont les seules données à stocker pour chaque sous-séquence.
Chaque élément de m représente une sous-séquence. Pour m[j] ,
-
j est la longueur de la sous-séquence.
-
m[j] est l'indice (en x ) du dernier élément de la sous-séquence.
- donc, x[m[j]] est la valeur du dernier élément de la sous-séquence.
L est la longueur de la plus longue sous-séquence trouvée jusqu'à présent. La première L valeurs de m sont valides, les autres ne sont pas initialisés. m peut commencer avec le premier élément étant 0, le reste non initialisé. L augmente au fur et à mesure de l'exécution de l'algorithme, de même que le nombre de valeurs initialisées de m .
Voici un exemple d'exécution. x[i] et m à la fin de chaque itération est donnée (mais les valeurs de la séquence sont utilisées à la place des index).
La recherche dans chaque itération est de trouver où placer x[i] . Elle doit être aussi à droite que possible (pour obtenir la séquence la plus longue) et être supérieure à la valeur située à sa gauche (pour qu'il s'agisse d'une séquence croissante).
0: m = [0, 0] - ([0] is a subsequence of length 1.)
8: m = [0, 0, 8] - (8 can be added after [0] to get a sequence of length 2.)
4: m = [0, 0, 4] - (4 is better than 8. This can be added after [0] instead.)
12: m = [0, 0, 4, 12] - (12 can be added after [...4])
2: m = [0, 0, 2, 12] - (2 can be added after [0] instead of 4.)
10: m = [0, 0, 2, 10]
6: m = [0, 0, 2, 6]
14: m = [0, 0, 2, 6, 14]
1: m = [0, 0, 1, 6, 14]
9: m = [0, 0, 1, 6, 9]
5: m = [0, 0, 1, 5, 9]
13: m = [0, 0, 1, 5, 9, 13]
3: m = [0, 0, 1, 3, 9, 13]
11: m = [0, 0, 1, 3, 9, 11]
7: m = [0, 0, 1, 3, 7, 11]
15: m = [0, 0, 1, 3, 7, 11, 15]
Nous savons maintenant qu'il existe une sous-séquence de longueur 6, se terminant par 15. Les valeurs réelles de la sous-séquence peuvent être trouvées en les stockant dans le fichier P pendant la boucle.
Récupération de la meilleure sous-séquence :
P stocke l'élément précédent dans la sous-séquence la plus longue (en tant qu'indice de x), pour chaque nombre, et est mis à jour au fur et à mesure que l'algorithme avance. Par exemple, lorsque nous traitons 8, nous savons qu'il vient après 0, donc nous stockons le fait que 8 est après 0 dans P . Vous pouvez travailler à rebours à partir du dernier chiffre, comme une liste chaînée, pour obtenir la séquence complète.
Ainsi, pour chaque nombre, nous connaissons le nombre qui le précède. Pour trouver la sous-séquence se terminant par 7, on regarde P et voir ça :
7 is after 3
3 is after 1
1 is after 0
On a donc la sous-séquence [0, 1, 3, 7].
Les sous-séquences se terminant par 7 ou 15 partagent certains chiffres :
15 is after 11
11 is after 9
9 is after 6
6 is after 2
2 is after 0
Nous avons donc les sous-séquences [0, 2, 6, 9, 11], et [0, 2, 6, 9, 11, 15] (la plus longue sous-séquence croissante).
5 votes
Veuillez expliquer ce que vous ne comprenez pas exactement. Parcourez patiemment l'explication sur Wikipedia, et posez des questions sur la première chose que vous ne comprenez pas. L'explication est en fait assez lisible, je pense.
1 votes
Notez que vous pouvez modifier votre question en utilisant le bouton "modifier" situé en dessous. Utilisez-le pour poser une question plus précise. Bonne chance !
0 votes
Voici une implémentation en javascript sur laquelle j'ai travaillé. gist.github.com/4497653