Warum ist Radix Sort

23

Bei der Radix-Sortierung sortieren wir zuerst nach der niedrigstwertigen Ziffer, dann nach der zweitniedrigstwertigen Ziffer usw. und erhalten dann eine sortierte Liste.

Wenn wir nun eine Liste von Zahlen haben, brauchen wir Bits, um zwischen diesen Zahlen zu unterscheiden. Die Anzahl der von uns durchgeführten Radix-Sortierdurchläufe beträgt also . Jeder Durchlauf dauert und daher ist die Laufzeit der Radix-Sortierunglog n log n O ( n ) O ( n log n )nlognlognO(n)O(nlogn)

Es ist jedoch bekannt, dass es sich um einen linearen Zeitalgorithmus handelt. Warum?

Pratik Deoghare
quelle
Dies ist der Grund, warum für lineare Zeitsortierungen normalerweise ganze Zahlen über einen festen Bereich eingegeben werden müssen. Für die Radix-Sortierung ist ein fester Bereich für die Ziffern erforderlich. In Ihrem Beispiel haben Sie angenommen, dass der Bereich , aber für die Ziffern ist jeder ganzzahlige Bereich möglich. Sie hätten zum Beispiel[ 0 , [0,1][0,n]
Joe

Antworten:

19

Wenn wir eine Liste mit Zahlen haben, brauchen wir Bitslog nnlogn

Nein: Wenn wir eine Liste von Zahlen zwischen und , brauchen wir Bits. Es gibt im Allgemeinen keine Beziehung zwischen und .2 k - 1 k k log n02k1kklogn

Wenn die Zahlen alle verschieden sind, haben und die Grundsortierung nach verschiedenen Zahlen daher eine zeitliche Komplexität von . Im Allgemeinen ist die Komplexität der Radix-Sortierung wobei die Anzahl der zu sortierenden Elemente und die Anzahl der Bits in jedem Element ist.Ω ( n log n ) Θ ( nlognkΩ(nlogn)n kΘ(nk)nk

Zu sagen, dass die Komplexität der Radix-Sortierung bedeutet, dass für die Zahlen eine feste Bitgröße verwendet wird. Dies impliziert, dass es für ausreichend große viele doppelte Werte geben wird.nO(n)n


Es gibt einen allgemeinen Satz, dass eine Array- oder Listensortiermethode, bei der zwei Elemente gleichzeitig verglichen werden, im schlimmsten Fall nicht schneller als kann. Die Radix-Sortierung funktioniert nicht beim Vergleichen von Elementen, aber die gleiche Beweismethode funktioniert. Die Radix-Sortierung ist ein Entscheidungsprozess, um zu bestimmen, welche Permutation auf das Array angewendet werden soll. es gibtPermutationen des Arrays und der Radix-Sortierung treffen binäre Entscheidungen, dh sie entscheiden, ob zwei Elemente in jeder Stufe vertauscht werden sollen oder nicht. Nach binären Entscheidungen kann die Radix-Sortierung zwischen Permutationen entscheiden. Um die zu erreichenmöglichen Permutationen ist es notwendig, dass .n ! m 2 m n ! m log ( n ! ) = Θ ( n log n )Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

Eine Annahme im Beweis, die ich oben nicht geschrieben habe, ist, dass der Algorithmus in dem Fall funktionieren muss, in dem die Elemente verschieden sind. Wenn a priori bekannt ist, dass die Elemente nicht alle verschieden sind, ist die Anzahl der möglichen Permutationen geringer als das volle. Beim Sortieren von Bit-Zahlen ist es nur möglich, verschiedene Elemente zu haben , wenn ; In diesem Fall ist die Komplexität der Radix-Sortierung tatsächlich . Für größere Werte von muss es Kollisionen geben, was erklärt, wie eine Radix-Sortierung eine Komplexität haben kann, die kleiner als wenn .k n n 2 k Ω ( n log n ) n Θ ( n log n ) n > 2 kn!knn2kΩ(nlogn)nΘ(nlogn)n>2k

Gilles 'SO - hör auf böse zu sein'
quelle
1
ww=642wO(1)nw=O(logn)
9

O(n)0k1kΘ(n+k)k=O(n)

ddΘ(d(n+k))dk=O(n)

Juho
quelle
1
[0,N1]N=O(nd)dO(d)O(n)
-2

k=log2(n)16

Alexandre Kandalintsev
quelle
6
log2nlog16n