Pourquoi Radix Sort ?


23

Dans le tri radix, nous trions d'abord par chiffre le moins significatif puis nous trions par deuxième chiffre le moins significatif et ainsi de suite et nous nous retrouvons avec une liste triée.

Maintenant, si nous avons une liste de nombres, nous avons besoin de bits pour distinguer ces nombres. Le nombre de passes de tri radix que nous effectuerons sera donc . Chaque passage prend temps et donc le temps d'exécution du tri radix estlog n log n O ( n ) O ( n log n )nlognlognO(n)O(nlogn)

Mais il est bien connu qu'il s'agit d'un algorithme de temps linéaire. Pourquoi?


C'est pourquoi les tris temporels linéaires nécessitent généralement que l'entrée soit des entiers sur une plage fixe. Le tri Radix nécessite une plage fixe sur les chiffres. Dans votre exemple, vous avez supposé que la plage était , mais toute plage entière est possible pour les chiffres; par exemple, vous auriez pu choisir[ 0 , [0,1][0,n]
Joe

Réponses:


19

si nous avons une liste de nombres dont nous avons besoin bitslog nnlogn

Non: si nous avons une liste de nombres entre et , nous avons besoin de bits. Il n'y a aucune relation entre et en général.2 k - 1 k k log n02k1kklogn

Si les nombres sont tous distincts, alors , et le tri radix sur des nombres distincts a donc une complexité temporelle de . En général, la complexité du tri radix est où est le nombre d'éléments à trier et est le nombre de bits dans chaque élément.Ω ( n log n ) Θ ( nlognkΩ(nlogn)n kΘ(nk)nk

Dire que la complexité du tri radix est signifie prendre une taille de bit fixe pour les nombres. Cela implique que pour suffisamment grand , il y aura de nombreuses valeurs en double.nO(n)n


Il existe un théorème général selon lequel une méthode de tri de tableau ou de liste qui fonctionne en comparant deux éléments à la fois ne peut pas s'exécuter plus rapidement que dans le pire des cas. Le tri Radix ne fonctionne pas en comparant les éléments, mais la même méthode de preuve fonctionne. Le tri Radix est un processus de décision pour déterminer la permutation à appliquer au tableau; il y en apermutations du tableau, et le tri radix prend des décisions binaires, c'est-à-dire qu'il décide d'échanger ou non deux éléments à chaque étape. Après décisions binaires, le tri radix peut décider entre permutations. Pour atteindre lepermutations possibles, il faut que .n ! m 2 m n ! m log ( n ! ) = Θ ( n log n )Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

Une hypothèse dans la preuve que je n'ai pas écrite ci-dessus est que l'algorithme doit fonctionner dans le cas où les éléments sont distincts. Si l'on sait a priori que les éléments ne sont pas tous distincts, alors le nombre de permutations potentielles est inférieur au complet. Lors du tri des nombres à bits, il n'est possible d'avoir éléments distincts que lorsque ; dans ce cas, la complexité du tri radix est en effet . Pour des valeurs plus grandes de , il doit y avoir des collisions, ce qui explique comment le tri radix peut avoir une complexité inférieure à lorsque .k n n 2 k Ω ( n log n ) n Θ ( n log n ) n > 2 kn!knn2kΩ(nlogn)nΘ(nlogn)n>2k


1
Un autre point de vue est celui du modèle de coût word-RAM: Notre machine peut fonctionner avec des entiers de bits en temps constant. (Les machines actuelles ayant ) De cette façon, une étape de tri de distribution avec compartiments peut être effectuée en en accédant directement à un élément de tableau correspondant. De cette façon, le tri radix est linéaire pour entiers de bits chacun. w = 64 2 w O ( 1 ) n w = O ( log n )ww=642wO(1)nw=O(logn)
Sebastian

9

Soyez prudent avec votre analyse: que supposez-vous pour faire fonctionner le tri en temps ? En effet, chacun de vos chiffres est compris entre et , ce qui signifie que vos chiffres peuvent prendre valeurs possibles. Vous avez besoin d'un algorithme de tri stable, vous pouvez par exemple choisir le tri par comptage. Le comptage du tri s'exécute en temps . Si , le tri de comptage s'exécute en temps linéaire.0 k - 1 k Θ ( n + k ) k = O ( n )O(n)0k1kΘ(n+k)k=O(n)

Chacune de vos chaînes ou nombres a des chiffres en . Comme vous le dites, vous faites passer sur eux. Par conséquent, le tri radix s'exécute clairement en temps . Mais si nous considérons constant et , nous voyons que le tri radix s'exécute en temps linéaire.d Θ ( d ( n + k ) ) d k = O ( n )ddΘ(d(n+k))dk=O(n)


1
Par exemple, supposons que vous triez des entiers dans la plage pour certains pour la constante . Ensuite, vous pouvez avoir chiffres chacun avec la plage . N = O ( n d ) d O ( d ) O ( n )[0,N1]N=O(nd)dO(d)O(n)
Joe

-2

Je pense que l'hypothèse est fausse. Vous pouvez effectuer un tri radix avec des nombres en hexadécimal, par exemple. Ainsi, à chaque étape, vous divisez votre tableau de nombres en compartiments.16k=log2(n)16


6
En ce qui concerne big-O, il n'y a pas de différence entre et . log 16 nlog2nlog16n
Rick Decker
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.