Tri en temps linéaire? [fermé]

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

C'est un examen pour mon test, jeudi, et je n'ai aucune idée de comment aborder ce problème.

21
demandé sur Pete Kirkham 2009-04-15 02:25:08

8 réponses

Aussi jeter un oeil à liés sortes trop: casier de tri ou comptage tri ainsi que radix tri tel que mentionné par Pukku.

22
répondu Ray Hidayat 2009-04-14 22:29:39

Regardez radix tri.

23
répondu Reunanen 2009-04-14 22:26:22

Quand les gens disent "algorithme de tri", ils se réfèrent souvent à "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 ça". Donc, si vous vous limitez à poser cette question sur les données, vous n'obtiendrez jamais plus de n*log(n) (c'est le résultat d'une recherche log(n) Des n ordres factoriels possibles d'un ensemble de données).

Si vous pouvez échapper aux contraintes de "comparison sort" et demander un plus question sophistiquée sur un morceau de données, par exemple "Quelle est la base 10 radix de ces données" alors vous pouvez trouver n'importe quel nombre d'algorithmes de tri du temps linéaire, ils prennent juste plus de mémoire.

C'est un compromis espace-temps. Le tri de Comparason prend peu ou pas de ram et s'exécute dans N * log (n) time. le tri radix (par exemple) s'exécute dans la mémoire O(N) time et o(log (radix)).

8
répondu Arthur Ulfeldt 2009-04-14 23:46:16

Wikipedia montre de nombreux algorithmes de tri différents et leurs complexités. vous pourriez vouloir vérifier

3
répondu ent 2009-04-14 22:35:42

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

  • Construisez Un tableau de bits (2^31-1 bits = > ~256MB). Les initialiser à zéro.
  • Lisez l'entrée, pour chaque valeur que vous voyez, définissez le bit respectif dans le tableau sur 1.
  • analysez le tableau, pour chaque jeu de bits, affichez la valeur respective.

Complexité = > O (2n)

Sinon, utilisez le tri Radix:

Complexité = > O (kn) (espérons-le)

3
répondu Ash 2009-04-14 22:54:25

Pensez aux nombres comme des nombres à trois chiffres où chaque chiffre varie de 0 à n-1. Trier 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 d'exécution total correspond à Theta (n).

2
répondu Dogukan 2012-11-14 17:37:01

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

2
répondu Sanjaya R 2016-08-23 19:18:38

Comme algo est possible:

M;// unsorted array
lngth; //number items of M
for(int i=0; i < lngth; i++)sorted[M[i]];

Il est seul possible algo pour la complexité linéaire, mais il a la complexité O (k*N) par ram (n-number array elements, K -- element's len)

-2
répondu timrau 2016-03-16 16:47:40