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.
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.
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)
Une modification facile consiste à choisir le pivot de manière aléatoire. Cela donne de bons résultats avec une probabilité élevée .
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.
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:
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:
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²).
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]