web-dev-qa-db-fra.com

Tri en temps linéaire?

Étant donné un ensemble d'entrée de n entiers dans la plage [0..n ^ 3-1], fournissez un algorithme de tri temporel linéaire.

Ceci est un examen pour mon test jeudi et je n'ai aucune idée de la façon d'aborder ce problème.

23
Stefan Kendall

Jetez également un coup d'œil aux types connexes: tri par pigeonhole ou tri compté , ainsi que tri radix comme mentionné par Pukku.

24
Ray Hidayat

Jetez un oeil à tri radix .

23
Reunanen

Quand les gens disent "algorithme de tri", ils font souvent référence à "algorithme de tri par comparaison", qui est tout algorithme qui ne dépend que de pouvoir demander "est-ce que cette chose est plus grande ou plus petite que cela". Donc, si vous êtes limité à poser cette seule question sur les données, vous n'obtiendrez jamais plus que n * log (n) (c'est le résultat d'une recherche log (n) des n ordonnances factorielles possibles d'un ensemble de données) .

Si vous pouvez échapper aux contraintes du "tri par comparaison" et poser une question plus sophistiquée sur un élément de données, par exemple "quelle est la base 10 de ces données", alors vous pouvez trouver un certain nombre d'algorithmes de tri temporel linéaire, ils prennent juste plus de mémoire.

Il s'agit d'un compromis espace-temps. Le tri par comparaison prend peu ou pas de RAM et s'exécute en temps N * log (n). le tri radix (par exemple) s'exécute dans la mémoire O(n) temps ET O(log(radix))).

9
Arthur Ulfeldt

C'est vraiment simple, si n = 2 et les nombres sont uniques:

  • Construisez un tableau de bits (2 ^ 31-1 bits => ~ 256 Mo). Initialisez-les à zéro.
  • Lisez l'entrée, pour chaque valeur que vous voyez, définissez le bit respectif du tableau sur 1.
  • Scannez le tableau, pour chaque jeu de bits, sortez la valeur respective.

Complexité => O (2n)

Sinon, utilisez Radix Sort:

Complexité => O(kn) (avec un peu de chance)

3
Ash

wikipedia montre de nombreux algorithmes de tri différents et leurs complexités. vous voudrez peut-être les vérifier

3
ent

Un ensemble d'une plage limitée de nombres peut être représenté par un bitmap de bits RANGE. Dans ce cas, un bitmap de 500 Mo, donc pour tout sauf les listes énormes, vous feriez mieux avec Radix Sort. Lorsque vous rencontrez le nombre k, définissez bitmap [k] = 1. Parcours unique dans la liste, O (N).

2
Sanjaya R

Considérez les nombres comme des nombres à trois chiffres où chaque chiffre va de 0 à n-1. Triez ces nombres avec le tri radix. Pour chaque chiffre, il y a un appel au tri de comptage qui prend du temps Theta (n + n), de sorte que le temps de fonctionnement total correspond à Theta (n).

2
Dogukan