Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt quinze plus seize
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Retour

Résumé de la discussion (messages les plus récents en premier)

yoshi
13-01-2014 16:09:10

Salut,

Merci, c'est sympa.
Si les éléments des sous-suites sont consécutifs, ce n'est pas "méchant", d'accord ...
Le problème que j'ai rencontré est le cas : pas forcément consécutifs.
Ça, c'est une autre paire de manches : c'est la première fois, en programmation, que j'ai failli renoncer...

J'ai pourtant écrit, il y a longtemps un logiciel de conjugaison française : je me suis acharner à ce qu'il puisse trouver de lui-même le groupe des verbes, et plus précisément celui des verbes en "ir" qui sont soit du 2e, soit du 3e et ce, sans lexique de verbes.
J'ai fini par trouver une astuce en 4/5 lignes avec quand même une douzaine d'exceptions.

Mais là avec sous-suites, j'ai bien cru devoir capituler...

@+

miq
13-01-2014 15:42:57

Bonjour,

@yoshi: apparemment les éléments des sous-suites ne sont pas nécessairement consécutifs.

Voilà comment j'ai codé la seconde question du problème :


tlm=tabLongueurMax(u)
iCur=iPrev=longueurMax(u)
r=[]
while iPrev>=0:
    r.insert(0,u[iCur])
    iPrev=iCur-1
    while iPrev>=0 and tlm[iPrev]!=tlm[iCur]-1:
        iPrev-=1
    iCur=iPrev
 

avec u=[2, 0, 1, 5, 4, 6, 7, 3]
on obtient tlm=[1, 1, 2, 3, 3, 4, 5, 3]
puis iCur=6
et enfin r=[0, 1, 4, 6, 7]

L'idée est de partir de l'indice de la fin de la sous-liste et de remonter chercher quel est l'indice du précédent le plus proche.

totomm
30-12-2013 19:36:42

Bonsoir,

Marie-Josephe post #8 a écrit :

Ainsi avec ces deux fonctions, je connais:
- La longueur de la plus longue sous-suite croissante
- L'indice à laquelle termine cette plus longue sous-suite

Et maintenant j'aimerais connaître à partir de ces informations la dite plus longue sous-suite. J'espère avoir été clair..

Outre ce que pose yoshi, il faudrait dire :

" - La longueur des plus longues sous-suites croissantes, car par exemple :
U : [0,1,7,8,9,2,5,6,3,4] contient 3 sous suites croissantes de longueurs 5 se terminant en 4, 7 et 9 !
Même pour ne redonner que la première des trois, il faut reprendre le tableau u …?!

Il n'est pas dit non plus que le tableau  contient des entiers "tous différents"
Si des entiers peuvent apparaître plusieurs fois, gare aux pièges dans la programmation de tabLongueurMax(u)

yoshi
30-12-2013 14:26:19

Salut,

Avec la liste u= [2,0,1,5,4,6,7,3], si j'ai bien compris l'énoncé, les listes des sous-suites croissantes sont
[2],[0],[1],[5],[4],[6],[7],[3]
[0,1],[1,5],[4,6],[6,7]
[0,1,5]
avec des indices consécutifs...
Je ne vois donc pas à quelle sous-suite tu te réfères en disant que la longueur max est 5...
Cela dit, puisque tu as écrit :

je connais:
- La longueur de la plus longue sous-suite croissante
- L'indice auquel se termine cette plus longue sous-suite

Tu crées une 3e fonction à qui tu passes en paramètre ta liste u.
Dans cette fonction
tu commences par chercher n = len(u)
Ensuite, comme je ne sais pas comment tu as construit tes fonctions, j'en suis réduit aux généralités.
Tu récupères, en appelant tour à tour les 2 fonctions précédentes, ta LongMax et ton indice_fin...
Pour extraire la sous-suite
- si les indices sont consécutifs, tu demandes u[indice_fin+1-LongMax:Indice_fin+1]
- si les indices ne sont pas consécutifs, tu es préalablement obligée (dans la la recherche de la longueur max) obligée de stocker aussi les indices de tous les éléments d'une sous-suite.
Par ex pour la sous-suite [0,1,4,6,7], la longueur mas m'importe peu si j'ai stocké les indices correspondant :
IndicesListeMax=[1,2,4,5,6]
Dans ce cas :

for i in IndicesListeMax:
    print u[i],

t'affiche :  0 1 4 6 7

@+

totomm
30-12-2013 12:15:33

re,

ce n'est donc pas ce que j'avais supposé...j'ai eu tort de faire mes propres suppositions sur un énoncé insuffisamment précis !

Marie-Josephe
30-12-2013 11:33:59

Voici une partie de l'énoncé que j'aurais dû copier :

On considère une suite finie (un tableau) [tex]u = [u_0, u_1, ..., u_{n−1}][/tex] d’entiers. Une sous-suite de u est une suite finie de la forme [tex][u_{i1}, u_{i2}, ..., u_{ip}][/tex] telle que [tex] 0 \leq i_1 < i_2 < ... < i_p \leq n − 1[/tex] et [tex]u_{i1} \leq u_{i2} \leq ... \leq u_{ip}[/tex]

Marie-Josephe
30-12-2013 11:27:36

Oui c'est ça, ce sont des tableaux contenant des entiers naturels dans le desordre
Par exemple, on prend le tableau "u" : [2,0,1,5,4,6,7,3]
Alors la plus longue sous-suite croissante est [0,1,4,6,7].
Le programme tabLongueurMax me renvoie [1, 1, 2, 3, 3, 4, 5, 3] qui regroupe les valeurs de m (qui sont la longueur de la plus longue sous-suite terminant à cet indice). Puis longueurMax renvoie alors 5.

Ainsi avec ces deux fonctions, je connais:
- La longueur de la plus longue sous-suite croissante
- L'indice à laquelle termine cette plus longue sous-suite

Et maintenant j'aimerais connaître à partir de ces informations la dite plus longue sous-suite. J'espère avoir été clair..

yoshi
30-12-2013 11:21:25

Ave,

Ah...
La liste u contiendrait donc une suite de nombres... entiers ? naturels ? relatifs ? nombres décimaux ? Autre chose ?
Conditionné, j'avais interprété suites comme les Suites arithmétiques, géométriques, récurrentes...
Cela n'aurait donc rien à voir ?

@+

totomm
30-12-2013 10:44:26

rebonjour,

merci yoshi pour les questions que j'aurais dû poser, je m'étais fait un petit exemple "a priori" :

u : [1,3,4,2,5,7,9,2,3]
i :   0,1,2,3,4,5,6,7,8

3 sous-suites croissantes :
[1,3,4] de début i=0 et de longueur 3
[2,5,7,9] de début i=3 et de longueur 4
[2,3] de début i=7 et de longueur 2

Cela est-il bien conforme au problème à programmer ?

yoshi
30-12-2013 10:16:54

Bonjour,

Le "bon" connaisseur de Python serait bien déjà intervenu s'il comprenait de quoi il retourne...
Or, la lecture de l'énoncé me laisse perplexe :

Pour tout i ∈ [0, n − 1], on note [tex]m_i[/tex] la longueur maximale des sous-suites croissantes de u dont le dernier terme est [tex]u_i[/tex]

Qu'est-ce que le tableau u ? Que contient-il ? sa définition existe-t-elle ? Que contient-il au juste ?
Au passage, pour utiliser des tableaux en Python, il faut faire appel au module numpy, sinon, ce sont des listes...
Que sont des sous-suites d'une liste ? Jamais entendu ce terme...
Comment aurais-je pu répondre à quelqu'un qui a passé le cap de la 1ere question, alors que je ne comprends même pas de quoi on y parle, donc qui est meilleur que moi  ?

Peut-être que la suggestion - à demi-mot - de totomm de poster les programmes déjà écrits permettrait de faire un peu de lumière ?

@+

[EDIT]
Si j'ai une liste L, non triée, composée de n éléments numériques, je peux en extraire le grand le plus petit sans écrire de fonctions supplémentaires via les fonctions natives max() et min() :

>>> L=[1,0,-1,7,20,4,3,5]
>>> max(L),min(L)
(20, -1)
>>>

Mais cela ne fait pas avancer le schmilblick comme disait Coluche...

totomm
30-12-2013 10:03:08

Bonjour,

Je suis navré que mon commentaire n'ait pas été assez clair.
yoshi est un bon connaisseur de Python, Son intervention serait bonne pour améliorer ou compléter les programmes qui seraient montrés.

Marie-Josephe
29-12-2013 21:24:46

Bonjour,

Ben non justement, les u_i ne sont PAS triés pas ordre croissant

totomm
29-12-2013 17:47:34

Bonjour,

Je suppose que pour i de 0 à n-1 vous avez rangé les i tels que [tex]u_i > u_{1+1}[/tex] (> ou =)
Reste à exploiter les différences entre les i rangés successivement : Ce sont les[tex] m_i[/tex]
La plus grande différence correspond à la plus longue sous-suite croissante…et vous en avez les deux bouts
Ai-je bien compris le problème ?

Marie-Josephe
29-12-2013 16:48:21

Bonjour,

Je dois coder en Python un programme qui prend en entrée un tableau u non trié de longueur n et qui me renvoie la plus longue sous-suite croissante. Voici le sujet :

Pour tout i ∈ [0, n − 1], on note [tex]m_i[/tex] la longueur maximale des sous-suites croissantes de u dont le dernier terme est [tex]u_i[/tex]
a. Programmer une fonction tabLongueurMax(u) qui calcule [tex]m_0[/tex], ..., [tex]m_{n-1}[/tex] de proche en proche (et les renvoie sous forme d’un tableau). En déduire une fonction longueurMax(u) déterminant la longueur maximale des sous-suites croissantes de u.
[tex]b.[/tex] À l’aide des fonctions précédentes, écrire une fonction plssc(u) qui détermine une plus longue sous-suite croissante de u.

J'ai réussi à coder les deux programmes demandés par la question a) , mais je ne sais pas comment les utiliser pour obtenir la plus longue sous-suite croissante... Si vous aviez une idée, pas nécessairement en langage python mais juste l'idée de l'algorithme... merci d'avance !

Pied de page des forums