Pour trouver la médiane d'un tableau non trié, nous pouvons créer un min-tas en fois pour éléments, puis extraire un par un éléments pour obtenir la médiane. Mais cette approche prendrait temps.n n / 2 O ( n log n )
Peut-on faire la même chose par une méthode en temps? Si nous pouvons, alors comment?
Réponses:
C'est un cas particulier d'un algorithme de sélection qui peut trouver le ème élément le plus petit d'un tableau, k étant la moitié de la taille du tableau. Il existe une implémentation linéaire dans le pire des cas.k k
Algorithme de sélection générique
Voyons tout d'abord un algorithmek
find-kth
qui trouve le ème élément le plus petit d'un tableau:La fonction
split(A, pivot)
renvoieL,R
telle que tous les éléments dedansR
sont plus grands quepivot
etL
tous les autres (moins une occurrence depivot
). Ensuite, tout est fait récursivement.C'est en moyenne mais O ( n 2 ) dans le pire des cas.O ( n ) O ( n2)
Le pire cas linéaire: l' algorithme de médiane des médianes
Un meilleur pivot est la médiane de toutes les médianes des sous-réseaux
A
de taille 5, en appelant la procédure sur le tableau de ces médianes.Ceci garantit dans tous les cas. Ce n'est pas si évident. Ces diapositives PowerPoint sont utiles pour expliquer l’algorithme et la complexité.O ( n )
Notez que la plupart du temps, l'utilisation d'un pivot aléatoire est plus rapide.
la source
5
standard? Et si la taille de A est inférieure à 5?return A[k]
est incorrect (sauf s’ilA
est trié, ce qui rendrait l’algorithme inutile). S'ilsplit
est arrivé de diviser deA
telle sorte quek = |L| + 1
vous ne sachiez toujours pas où se trouve l'k
élément th. Votre cas de base est le moment où|A| = 1
vous devez encore faire l'un des deux appels récursifs.L'idée principale de l'algorithme est d'utiliser l'échantillonnage. Nous devons trouver deux éléments proches les uns des autres dans l'ordre trié du tableau et dont la médiane est située entre eux. Voir la référence [MU2017] pour une discussion complète.
[MU2017] Michael Mitzenmacher et Eli Upfal. "Probabilités et calcul: techniques de randomisation et probabilistes dans les algorithmes et l'analyse des données", chapitre 3, pages 57-62. Cambridge University Press, deuxième édition, 2017.
la source