Découvreurs ou inventeurs |
Manuel Blum, Robert Floyd, Vaughan Pratt (en), Ronald Rivest, Robert Tarjan |
---|---|
Date de découverte | |
Problème lié | |
Structure des données | |
Basé sur |
Pire cas | |
---|---|
Meilleur cas |
Pire cas |
---|
En informatique, la médiane des médianes est un algorithme de sélection pour trouver le k-ième élément le plus grand au sein d'un tableau initialement non triée. Il est basé sur l'algorithme Quickselect. Cet algorithme est optimal dans le pire cas, avec une complexité en temps linéaire. La brique de base de l'algorithme est la sélection d'une médiane approchée en temps linéaire. L'algorithme de la médiane des médianes fut publié par Blum, Floyd, Pratt (en), Rivest et Tarjan en 1973 dans Time bounds for selection[2], et est parfois appelé BFPRT d'après les initiales des noms des auteurs.
L'algorithme se déroule en 3 étapes :
Exécutons l'algorithme sur le tableau [13, 12, 17, 96, 22, 15, 23, 16, 45, 95, 11, 24, 14, 38, 94, 8, 2, 53, 86, 28, 10, 9, 29, 61, 89, 26, 5, 30, 41, 69, 6, 0, 68, 62, 31, 97, 36, 33, 7, 82, 3, 42, 4, 54, 73, 21, 47, 92, 48, 27, 74, 59, 50, 49, 44, 88, 55, 57, 46, 40, 1, 99, 71, 58, 52, 18, 25, 84, 78, 60, 20, 51, 63, 64, 75, 32, 90, 80, 65, 34, 19, 66, 70, 77, 43, 35, 56, 93, 76, 67, 37, 72, 98, 85, 81, 91, 39, 83, 87, 79].
Commençons par faire des paquets de cinq :
[13, 12, 17, 96, 22, | 15, 23, 16, 45, 95, | 11, 24, 14, 38, 94, | 8, 2, 53, 86, 28, | 10, 9, 29, 61, 89, | 26, 5, 30, 41, 69, | 6, 0, 68, 62, 31, | 97, 36, 33, 7, 82, | 3, 42, 4, 54, 73, | 21, 47, 92, 48, 27, | 74, 59, 50, 49, 44, 88, 55, 57, 46, 40, 1, 99, 71, 58, 52, | 18, 25, 84, 78, 60, | 20, 51, 63, 64, 75, | 32, 90, 80, 65, 34, | 19, 66, 70, 77, 43, | 35, 56, 93, 76, 67, | 37, 72, 98, 85, 81, | 91, 39, 83, 87, 79]
que l'on visualise verticalement dans le tableau suivant :
13 | 15 | 11 | 2 | 9 | 5 | 0 | 7 | 3 | 21 | 44 | 40 | 1 | 18 | 20 | 32 | 19 | 35 | 37 | 39 | ||||||||||||||||||||
12 | 23 | 24 | 8 | 10 | 26 | 6 | 33 | 4 | 27 | 49 | 46 | 52 | 25 | 51 | 34 | 43 | 56 | 72 | 79 | ||||||||||||||||||||
17 | 16 | 14 | 28 | 29 | 30 | 31 | 36 | 42 | 47 | 50 | 55 | 58 | 60 | 63 | 65 | 66 | 67 | 81 | 83 | ||||||||||||||||||||
96 | 45 | 38 | 53 | 61 | 41 | 62 | 82 | 54 | 48 | 59 | 57 | 71 | 78 | 64 | 80 | 70 | 76 | 85 | 87 | ||||||||||||||||||||
22 | 95 | 94 | 86 | 89 | 69 | 68 | 97 | 73 | 92 | 74 | 88 | 99 | 84 | 75 | 90 | 77 | 93 | 98 | 91 |
Trions ensuite chaque paquets afin de récupérer les médianes de chacun d'eux (qui se trouvent sur la troisième ligne) :
12 | 15 | 11 | 2 | 9 | 5 | 0 | 7 | 3 | 21 | 44 | 40 | 1 | 18 | 20 | 32 | 19 | 35 | 37 | 39 | ||||||||||||||||||||
13 | 16 | 14 | 8 | 10 | 26 | 6 | 33 | 4 | 27 | 49 | 46 | 52 | 25 | 51 | 34 | 43 | 56 | 72 | 79 | ||||||||||||||||||||
Médianes | 17 | 23 | 24 | 28 | 29 | 30 | 31 | 36 | 42 | 47 | 50 | 55 | 58 | 60 | 63 | 65 | 66 | 67 | 81 | 83 | |||||||||||||||||||
22 | 45 | 38 | 53 | 61 | 41 | 62 | 82 | 54 | 48 | 59 | 57 | 71 | 78 | 64 | 80 | 70 | 76 | 85 | 87 | ||||||||||||||||||||
96 | 95 | 94 | 86 | 89 | 69 | 68 | 97 | 73 | 92 | 74 | 88 | 99 | 84 | 75 | 90 | 77 | 93 | 98 | 91 |
Le calcul de la médiane des médianes se fait récursivement en appelant l'algorithme sur la liste des médianes :
12 | 15 | 11 | 2 | 9 | 5 | 0 | 7 | 3 | 21 | 44 | 40 | 1 | 18 | 20 | 32 | 19 | 35 | 37 | 39 | ||||||||||||||||||||
13 | 16 | 14 | 8 | 10 | 26 | 6 | 33 | 4 | 27 | 49 | 46 | 52 | 25 | 51 | 34 | 43 | 56 | 72 | 79 | ||||||||||||||||||||
Médianes | 17 | 23 | 24 | 28 | 29 | 30 | 31 | 36 | 42 | 47 | 50 | 55 | 58 | 60 | 63 | 65 | 66 | 67 | 81 | 83 | |||||||||||||||||||
22 | 45 | 38 | 53 | 61 | 41 | 62 | 82 | 54 | 48 | 59 | 57 | 71 | 78 | 64 | 80 | 70 | 76 | 85 | 87 | ||||||||||||||||||||
96 | 95 | 94 | 86 | 89 | 69 | 68 | 97 | 73 | 92 | 74 | 88 | 99 | 84 | 75 | 90 | 77 | 93 | 98 | 91 |
Finalement, on appelle récursivement sur les éléments plus petit que 47 (en gris) si l'on sait que le k-ième élément est là, ou sur les éléments plus grand que 47.
12 | 15 | 11 | 2 | 9 | 5 | 0 | 7 | 3 | 21 | 44 | 40 | 1 | 18 | 20 | 32 | 19 | 35 | 37 | 39 | ||||||||||||||||||||
13 | 16 | 14 | 8 | 10 | 26 | 6 | 33 | 4 | 27 | 49 | 46 | 52 | 25 | 51 | 34 | 43 | 56 | 72 | 79 | ||||||||||||||||||||
Médianes | 17 | 23 | 24 | 28 | 29 | 30 | 31 | 36 | 42 | 47 | 50 | 55 | 58 | 60 | 63 | 65 | 66 | 67 | 81 | 83 | |||||||||||||||||||
22 | 45 | 38 | 53 | 61 | 41 | 62 | 82 | 54 | 48 | 59 | 57 | 71 | 78 | 64 | 80 | 70 | 76 | 85 | 87 | ||||||||||||||||||||
96 | 95 | 94 | 86 | 89 | 69 | 68 | 97 | 73 | 92 | 74 | 88 | 99 | 84 | 75 | 90 | 77 | 93 | 98 | 91 |
Parmi les groupes, la moitié ont leur médiane en dessous du pivot (la médiane des médianes), ce qui garantit au moins éléments en dessous du pivot (3 parmi chacun des groupes). Ainsi, le pivot choisi est à la fois inférieur à environ éléments et plus grand que éléments. Ainsi, la médiane divise les éléments choisis quelque part entre 30 %⁄70 % et 70 %⁄30 %, ce qui assure dans le pire des cas un comportement linéaire de l'algorithme.
Dans cette section, nous montrons que l'algorithme est en temps linéaire en le nombre d'éléments, c'est-à-dire que le nombre d'étapes réalisées par l'algorithme est un où est le nombre d'éléments dans la liste. On note le temps d’exécution de l'algorithme sur une entrée de taille . On a la récurrence suivante :
où
De cette formule on vérifie par récurrence sur :
Ainsi est un
La sélection d'une médiane approchée en temps linéaire peut aussi être utilisée pour garantir au tri rapide une complexité en dans le pire cas. Dans les deux cas, l'utilisation de la médiane est en moyenne moins efficace que le choix d'un pivot aléatoire, qui évite le surcoût du calcul du pivot.