N'y a-t-il pas d'algorithme de tri avec toutes les propriétés souhaitées spécifiques?

22

Sur le site Web des algorithmes de tri , la réclamation suivante est faite:

L'algorithme de tri idéal aurait les propriétés suivantes:

  • Stable: les clés égales ne sont pas réorganisées.
  • Fonctionne en place, nécessitant d'espace supplémentaire.O(1)
  • Comparaisons clés pire des cas .O(nlg(n))
  • Swaps pire des cas .O(n)
  • Adaptatif: accélère jusqu'à lorsque les données sont presque triées ou lorsqu'il y a peu de clés uniques.O(n)

Aucun algorithme ne possède toutes ces propriétés et le choix de l'algorithme de tri dépend donc de l'application.

Ma question est, est-il vrai que

il n'y a pas d'algorithme [de tri] qui possède toutes ces propriétés

et si oui, pourquoi? Qu'est-ce qui rend ces propriétés impossibles à réaliser simultanément?

James Faulcon
la source
4
Ils signifient probablement simplement qu'aucun algorithme de tri connu n'a toutes ces propriétés.
Yuval Filmus
3
Y a-t-il même une réunion de tri basée sur la comparaison 3 & 4?
greybeard
4
@JohnFeminella Il a besoin d'au moins des comparaisons , mais comment cela nous dit-il quelque chose sur le nombre de swaps? Ω(nJournal(n))
Tom van der Zanden
2
@JohnFeminella Nitpick: "mieux que " est une déclaration vide. Vous devez utiliser ou si vous voulez parler de limites inférieures. Ω ΘO(_)ΩΘ
Raphael
1
Tout algorithme de tri peut être rendu stable en ajoutant comme clé secondaire la position d'origine de l'élément. Cependant, cela ne le rend pas en place car cela prendrait O (n) de mémoire supplémentaire.
Giovanni Botta

Réponses:

6

WikiSort et GrailSort sont deux algorithmes assez récents qui font des comparaisons clés en place, stables et dans le pire des cas . Malheureusement, je ne les comprends pas assez bien pour savoir s'ils approchent les swaps O ( n ) ou sont adaptatifs, donc je ne sais pas s'ils violent les quatrième et cinquième conditions que vous avez.O(n lg(n))O(n)

En examinant l'article "Fusion basée sur un ratio stable sur place", de Pok-Son Kim et Arne Kutzner lié à la page WikiSort GitHub, Kim et Kutzner prétendent avoir une opération de fusion qui est (WikiSort est une variante de Mergesort) mais je ne sais pas si cela se traduit par WikiSort ayant des échangesO(n). GrailSort est censé être plus rapide (dans la page WikiSort GitHub), donc je pourrais imaginer qu'il est probable qu'ils aient tous les deux lesswapsO(n) lesplus défavorableset qu'ils soient adaptatifs.O(m(nm+1))O(n)O(n)

Si quelqu'un parvient à comprendre WikiSort et / ou GrailSort, j'apprécierais qu'ils répondent également à ma question ouverte à ce sujet

user834
la source
5

Le smoothsort de Dijkstra se rapproche, mais n'est pas stable.

vonbrand
la source
3

Aucun algorithme connu ne satisfait toutes ces propriétés. Ces propriétés sont devenues recherchées alors que nous développions davantage d'algorithmes de tri. Par exemple, le tri à bulles (sans doute l'algorithme de tri le plus primitif), était probablement non stable dans la première implémentation, mais a été conçu pour être stable car les informaticiens ont cherché à le rendre plus efficace dans les implémentations ultérieures. Ainsi, les informaticiens ont très probablement choisi les meilleurs traits parmi les meilleurs algorithmes, et en conséquence, vous avez dressé une liste de tous ces traits souhaitables. En réalité, il est difficile d'avoir le meilleur de tous les mondes. Pas impossible, mais peut-être impossible avec nos architectures actuelles.

OΩΘ

Siggy
la source
1
Bienvenue! C'est bien, mais je ne vois pas ce que la stabilité a à voir avec l'efficacité: c'est simplement une préférence pour que les sections de la liste avec des clés identiques ne soient pas "aléatoirement" permutées par l'algorithme.
David Richerby
Oui, mais est-ce prouvablement possible ou impossible?
James Faulcon
1

(Même si c'est une vieille question, je suis tombée dessus et d'autres pourraient le faire aussi.)

Il existe en effet un algorithme qui satisfait (1) - (4) et la seconde moitié de (5), est donc très proche de l'exigence ci-dessus. Il est décrit dans [1] et combine plusieurs astuces inventées au cours des dernières décennies.

[1]: Franceschini, G. Theory Comput Syst (2007) 40: 327. https://doi.org/10.1007/s00224-006-1311-1

Sébastien
la source