Recherche des deux plus grand éléments d'une liste : tournoi - Algo - Programmation
Marsh Posté le 05-05-2006 à 15:23:17
Le plus simple si ta liste n'est pas trie est en complexite O(n) et c'est comme une recherche de max sauf que tu as deux variables au lieux d'une. 
Si ta liste est triee alors tu peux avoir une recherche dichotomique: O(log(n)) toujours avec deux variables...
Marsh Posté le 06-05-2006 à 01:28:56
| zianvd a écrit : Bonjour,  | 
 
Salut 
 
je viens de mettre en oeuvre la méthode en C, l'algo fonctionne bien, mais on doit pouvoir faire sans doute mieux. 
 
On suppose qu'on a un tableau T du style 
________________________________________ 
|  5 |  1 | 10 |  3 | 15 | 19 |  5 |  8 | 20 | 30 | 
________________________________________ 
   0     1     2    3     4     5     6    7    8     9 
 
On va construire une suite de tableaux de ce style 
 
T1 
__________________ 
|  0 |  2 | 5 |  7 | 9 |  
__________________ 
 
On mémorise 0 car T[0] est plus grand que T[1]. 
On mémorise 2 car T[2] est plus grand que T[3]. 
On mémorise 5 car T[5] est plus grand que T[6]. 
 
 
T2 
___________ 
|  2 | 5 | 9 |  
___________ 
 
On mémorise 2 car T[T1[1]] est plus grand que T[T1[0]]. 
On mémorise 5 car T[T1[2]] est plus grand que T[T1[3]]. 
On mémorise 9 car T[T1[4]] est seul. 
 
 
T3 
________ 
|  5 | 9 |  
________ 
 
On mémorise 5 car T[T2[1]] est plus grand que T[T1[0]]. 
On mémorise 9 car T[T2[3]] est seul. 
 
T4 
____ 
|  9 |  
____ 
On a terminé, T[T4[0]] est le plus grand nombre. 
 
Pour pouvoir trouver le second plus grand élément, il faut parcourir la liste des tableaux en sens inverse 
J'ai donc créer une structure où je mémorise la place de chaque nombre dans le tableaux précédent. 
Mes tableaux T1, T2, et T3 se présentent sous cette forme : 
   
T1 
__________________ 
|  0 |  2 | 5 |  7 | 9 |  
__________________ 
|  0 |  2 | 5 |  7 | 9 |  
__________________ 
 
 
T2 
___________ 
|  2 | 5 | 9 |  
___________ 
|  1 | 3 | 4 |  
___________ 
 
T3 
________ 
|  5 | 9 |  
________ 
|  1 | 2 |  
________ 
 
 
T4 
____ 
|  9 |  
____ 
|  1 |  
____ 
 
 
Enfin il faut faire attention aux limites de tableaux, donc il faut mémoriser dans un tableaux à part la taille de chaque tableau intermédiaire.
Marsh Posté le 07-05-2006 à 10:41:35
Au lieu de s'en tenir au système de l'arbre et du parcours en arrière, en réfléchissant un peu, on peut trouver les deux nombres en même temps : en effet, on mémorisera en même temps le plus grand des nombres à comparer et le plus grand de ceux qu'il aura "dominés". 
 
  
On suppose qu'on a un tableau T du style  
___________________________________________ 
|  5 |  1 | 10 |  3 | 15 | 19 |  5 |  8 | 20 | 4 |30 |  
___________________________________________  
 
  
On va construire une suite de tableaux de ce style  
  
T1  
_________________________ 
|  5 | 10 |  19 |  8 | 20 | 30 | 
_________________________ 
|  1 |   3 | 15 |  5 |  4 |  MIN_INT 
_________________________ 
 
C'est - à - dire qu'on mémorise le plus grand et l'autre au premier tour. 
S'il reste un nombre tout seul, on peut utiliser INT_MIN en plus petit en C. 
  
  
T2  
_____________ 
| 10 | 19 | 30 |   
_____________ 
|  5 | 15 | 20 | 
_____________ 
  
Cette fois-ci on mémorise 10 car il est plus grand que 5 et comme 5 est plus grand que 3, on mémorise en second plus grand 5 
On mémorisera enxsuite 19 car il est plus grand que 8 et on garde 15. 
Enfin on mémorise 30 et 20 en plus petit 
  
T3  
_________ 
| 19 | 30 |   
_________ 
| 15 | 20 | 
__________ 
  
On garde (19, 15) et (30,20) 
  
T4  
_____ 
| 30 |   
_____  
| 20 | 
_____ 
On a terminé, 30 et 20 sont bien les deux plus grands nombres !
Marsh Posté le 03-05-2006 à 23:04:58
Bonjour,
 
 
Je n'arrive pas à trouver l'algorithme permettant de trouver les deux plus grands éléments d'une liste à l'aide de la méthode du tournoi...tout en ayant une complexité d'ordre n, ou logarithmique...
Je vois le principe des arbres où le premier plus grand élément est trouvé au premier tour, et le second plus grand élément est trouvé dés le deuxieme parcours (on aura conservé les perdants face au plus grand élémént du premier tour)...
mais je n'arrive pas àmettre en oeuvre.
Si quelqu'un a l'algorithme sous la main...