web-dev-qa-db-fra.com

Y'a-t-il un O(n) algorithme de tri entier?

La semaine dernière, je suis tombé sur cet article où les auteurs mentionnent sur la deuxième page:

Notez que cela produit une durée d'exécution linéaire pour les poids de bord entiers.

Le même sur la troisième page:

Cela donne un temps d'exécution linéaire pour les poids de bord entiers et O (m log n) pour un tri basé sur la comparaison.

Et à la 8ème page:

En particulier, le tri rapide par nombres entrainerait probablement une accélération considérable de GPA. 

Cela signifie-t-il qu'il existe un algorithme de tri O(n) dans des circonstances spéciales pour les valeurs entières? Ou est-ce une spécialité de la théorie des graphes?

PS:
Il se pourrait que la référence [3] soit utile car sur la première page, ils disent:

D'autres améliorations ont été obtenues pour les classes de graphes [..] telles que les poids de bord entiers [3], [...]

mais je n'ai eu accès à aucun des journaux scientifiques.

38
Karussell

Oui, le tri de base et le tri de comptage sont O(N). Ce ne sont PAS des tris basés sur des comparaisons, dont il a été prouvé qu'ils ont Ω(N log N) inférieur.

Pour être précis, le tri de base est O(kN), où k est le nombre de chiffres dans les valeurs à trier. Le tri compte est O(N + k), où k est l'intervalle des nombres à trier.

Il existe des applications spécifiques où k est suffisamment petit pour que le tri de base et le tri de comptage présentent des performances en temps linéaire.

53
polygenelubricants

Les tris de comparaison doivent être au moins Ω (n log n) en moyenne.

Cependant, en comptant les types et les types en base / linéairement avec la taille de l’entrée - comme ils ne sont pas des types de comparaison, ils exploitent la structure fixe des entrées.

11
ephemient

Tri par comptage: http://en.wikipedia.org/wiki/Counting_sort si vos entiers sont assez petits . Tri en ordre de rotation si vous avez des nombres plus grands (ceci est essentiellement une généralisation du tri par comptage ou une optimisation pour les plus grands nombres si vous voulez): http://en.wikipedia.org/wiki/Radix_sort

Il existe également un tri par seau: http://en.wikipedia.org/wiki/Bucket_sort

4
IVlad

Bien que pas très pratique (principalement en raison de la surcharge de mémoire), j'ai pensé mentionner/ Abacus (Bead) Sort comme un autre algorithme de tri temporel linéaire intéressant.

2
Dolphin

Ces algorithmes de tri basés sur le matériel:

Un algorithme de tri sans comparaison
Tri des nombres binaires dans le matériel - Un nouvel algorithme et son implémentation

Algorithme de tri Laser Domino - une expérience de pensée basée sur Counting Sort avec l’intention d’obtenir la complexité temporelle de O(n) par rapport à la fonction O(n + k) de Counting Sort.

1
abcoep

Ajout de détails - Dans la pratique, le meilleur algorithme de tri jusqu’à la date n’est pas O(n), mais 0 (n\sqrt {\ log\log n}).

Vous pouvez vérifier plus de détails sur cet algo dans l'article: http://dl.acm.org/citation.cfm?id=652131

0
akuriako