web-dev-qa-db-fra.com

Tri rapide Pire cas

Je travaille sur le programme dont j'ai besoin dans la suite pour mieux le comprendre.

Quelle est la durée d'exécution la plus défavorable pour Quicksort et quelle peut être la cause de cette dégradation des performances? Comment pouvons-nous modifier le programme quicksort pour atténuer ce problème?

Je sais que cela a le pire cas O(n^2) et je sais que cela se produit lorsque l'élément minimal ou maximal unique du pivot. Ma question est comment puis-je modifier le programme pour atténuer ce problème. 

Un bon algorithme sera bon.

29
John

Les performances de Quicksort dépendent de votre algorithme de sélection de pivot. L'algorithme de sélection du pivot le plus naïf consiste à choisir simplement le premier élément comme pivot. Il est facile de voir que cela entraîne le pire comportement si vos données sont déjà triées (le premier élément sera toujours le min).

Deux algorithmes courants permettent de résoudre ce problème: choisir un pivot de manière aléatoire ou choisir la médiane de trois. Le hasard est évident, donc je ne vais pas entrer dans les détails. La médiane sur trois implique la sélection de trois éléments (généralement le premier, le second et le dernier) et le choix de la médiane de ceux-ci comme pivot.

Étant donné que les générateurs de nombres aléatoires sont généralement pseudo-aléatoires (donc déterministes) et qu'une médiane non aléatoire de trois algorithmes est déterministe, il est possible de construire des données qui conduisent au pire comportement, bien qu'il soit rare qu'il apparaisse normalement.

Vous devez également prendre en compte l'impact sur les performances. La durée d'exécution de votre générateur de nombres aléatoires affectera la durée d'exécution de votre tri rapide. Avec une médiane de trois, vous augmentez le nombre de comparaisons.

34
Niki Yoshiuchi

Pire condition d'exécution: 

Quand à chaque fois le pivot choisi est 'le plus grand' ou le 'plus petit' et que ce modèle se répète

Donc pour 1 3 5 4 2

Si les pivots sont choisis dans l’ordre 1,2,3,4,5 ou 5,4,3,2,1 

alors le pire temps d'exécution est O (n * n)

Comment éviter le pire des cas: 

(1) Divisez le tableau en cinq ensembles. Ainsi, si 1..100 les ensembles sont (1..20) (21..40) (41..60) (61..80) (81..100) )

(2) Choisissez la médiane des cinq premiers éléments de chaque ensemble (3) (23) (43) (63) (83)

(3) Maintenant, choisissez la médiane parmi eux comme pivot, voici donc son (43)

10
theReverseFlick

Une modification facile consiste à choisir le pivot de manière aléatoire. Cela donne de bons résultats avec une probabilité élevée .

5
Gabe Moothart

Cela fait un moment, mais je pense que le pire des cas pour le tri rapide est quand les données ont déjà été triées. Une vérification rapide pour voir si les données sont déjà triées pourrait aider à résoudre ce problème.

4
Burton Samograd

La durée d'exécution la plus défavorable dépend de la méthode de partition dans quick-sort. Cela a deux aspects:

  • sélectionner le pivot
  • comment partitionner autour du pivot

De bonnes stratégies pour sélectionner le pivot ont été décrites dans les précédents articles (médiane des médianes, médiane de trois ou randomisation). Mais même si le pivot est judicieusement sélectionné, à l'extrême, si un tableau a tous les éléments égaux, cela conduira au pire des temps d'exécution si seulement deux partitions sont construites, car l'une d'elles portera les mêmes éléments, c'est-à-dire:

  • cela fait que la partie est appelée n fois, chacune prenant n/2 en moyenne, conduisant à O (n²)
  • ce n'est pas bon, car ce n'est pas un pire scénario théorique, mais un scénario assez courant
  • notez qu'il n'est pas résolu en détectant la partition vide, car le pivot pourrait avoir la valeur d'élément la plus élevée ou la plus basse (par exemple, la médiane est égale à 5, ce qui correspond également à la valeur d'élément la plus élevée, mais il peut rester quelques valeurs égarées <5)

Une solution à ce problème consiste à partitionner en trois partitions: une partition inférieure (éléments <pivot), une égale (éléments = pivot) et une partition supérieure. Les "= éléments de pivot" sont dans leur position finale. Les partitions inférieure et supérieure doivent encore être triées si elles ne sont pas vides.

Avec la randomisation, la médiane des médianes ou une combinaison quelconque pour sélectionner un pivot, le pire des scénarios est assez rare mais pas impossible, ce qui laisse l'algorithme avec une limite supérieure du pire des cas de O (n²). 

2
Chris K

La question que je me pose est fréquemment posée. La recherche AFAI il y a 2 clés de son pire.

  • Si le tableau est déjà trié, peu importe si croissant ou décroissant en plus de sélectionner le pivot comme minimum (plus petit) ou maximum (plus grand) élément de la liste. [2,3,4] ou [4,3,2]
  • Si tous les éléments sont identiques. [2,2,2]
0
snr