Obtenir le second minimum...

Résolu/Fermé
bilao Messages postés 71 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 8 novembre 2010 - 7 mars 2009 à 18:20
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 19 avril 2009 à 11:20
Bonsoir tous les commentçamarchiens,

Je cherche à programmer un fonction (en caml) qui à partir d'une liste fournit le deuxième plus petit élément de la liste. Je sens que ça doit être bête, mais je bloque....

Quelqu'un pourrait-il me donner des pistes dans n'importe quel language que ce soit (l'important c'est l'idée) ?

Merci d'avance
A voir également:

5 réponses

Bonjour

Tu utilises deux variables pour mémoriser les deux plus petits éléments.
soit m0 pour la + petite et m1 pour la seconde plus petite
Tu initialises avec les deux premiers éléments du tableau, avec la plus petite des deux dans m0
Tu balayes le tableau :
Si l'élément courant est > m1, tu l'oublies
S'il est compris entre m1 et m0, tu le mets dans m1
S'il est plus petit que m0, tu commences par recopier m0 dans m1 puis tu mets la valeur trouvée dans m0
À la fin, ton résultat est dans m1

Bref, c'est comme pour chercher la plus petite, sauf que tu mémorises les deux plus petites (et pas seulement la seconde plus petite !)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
7 mars 2009 à 18:48
Salut,

Lit ce thread
C'est en C.
0
bilao Messages postés 71 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 8 novembre 2010 4
7 mars 2009 à 18:57
J'ai pigé vos réponses merci. Pourtant l'itératif sur camL avec les listes est délicat. J'étais donc parti sur un programme récursif, mais ça n'empêche pas de m'inspirer de ce que j'ai vu.

Si vous avez aussi des suggestions récursives (en français pas en langage info histoire que je bosse un peu quand même) ce serait sympa !

Merci
0
bilao Messages postés 71 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 8 novembre 2010 4
8 mars 2009 à 11:42
Au final, j'ai utilisé une fonction auxiliaire (min_et_reste) qui fournit le minimum de la liste et la liste privée de ce minimum. J'ai tire ma fonction second_min que voici (si jamais quelqu'un se posait la même question...)


let rec min_et_reste liste = match liste with
| [] -> failwith"liste vide"
| [a] -> a,[]
| a::q -> let c,d = min_et_reste q in
if a<c then a,c::d else c,a::d;;

let second_min liste =
let c,d = min_et_reste liste in
let e,f = min_et_reste d in
e ;;

Merci et @+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
19 avril 2009 à 11:20
Ta solution me paraît un peu lourde bilao (d'un point de vue efficacité) car elle parcourt une liste, en créé une deuxième et la parcours aussi...

Voici une solution alternative (il faudra peut-être remplacé les < par des <= )
On considère que x est le premier minimum et y le deuxième :
let rec recherche x y l=
	match l with
	|[]-> y
	|t::q-> if t<x	then recherche t x q
			else if t<y	then recherche x t q
					else recherche x y q;;

let second_minimum l=
	match l with
	|a::b::q -> if a<b	then recherche a b q
				else recherche b a q
	|_-> failwith "liste trop petite";;
0