"Fast sortieren" von ganzen Zahlen in linearer Zeit


16

Ich bin daran interessiert, ein Array positiver ganzzahliger Werte in linearer Zeit zu sortieren (im RAM-Modell mit einheitlichem Kostenmaß, dh ganze Zahlen können bis zu logarithmischer Größe haben, aber es wird angenommen, dass arithmetische Operationen auf sie angewendet werden Zeiteinheit). Natürlich ist dies mit vergleichsbasierten Sortieralgorithmen nicht möglich, daher bin ich daran interessiert, eine "ungefähre" Sortierung zu berechnen, dh eine Permutation von von , die in der Regel sortiert , sondern eine „gute Annäherung“ der sortierten Version nicht wirklich . Ich gehe davon aus, dass wir die ganzen Zahlen in absteigender Reihenfolge sortieren, da dies die Aussage der Fortsetzung ein wenig angenehmer macht, aber man könnte das Problem natürlich auch andersherum formulieren.L=v1,,vnvσ(1),,vσ(n)LL

Ein mögliches Kriterium für eine ungefähre sortieren ist die folgende (*): lassen sein , für jeden , verlangen wir , dass (dh Die "quasi-sortierte" Liste wird von oben durch die abnehmende Funktion ) begrenzt. Es ist leicht zu erkennen, dass die tatsächliche Sortierung dies erfüllt: darf nicht größer als daher ist es höchstens ist und im Allgemeinen darf nicht größer sein als istNivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i.

Zum Beispiel kann Anforderung (*) durch den folgenden Algorithmus erreicht werden (vorgeschlagen von @Louis). Meine Frage ist: Gibt es eine Arbeit zu dieser Aufgabe, ganze Zahlen in linearer Zeit "fast zu sortieren", indem eine Bedingung wie (*) auferlegt wird, die die reale Sortierung erfüllen würde? Hat der unten stehende Algorithmus oder eine Variante davon einen festgelegten Namen?

Bearbeiten: Der Algorithmus wurde korrigiert und es wurden weitere Erklärungen hinzugefügt


Algorithmus:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

Dieser Algorithmus funktioniert aus folgenden Gründen wie beabsichtigt:

  1. Befindet sich ein Element im Bucket dann ist . vjvN/j

    v wird in den Eimer gegeben , alsoj=min(N/v,n)jN/vN/v

  2. Befindet sich ein Element im Bucket dann ist entweder oder . vjN/(j+1)<vj=n

    vj = min ( N / v , n ) , j = N / v j = n j = N / v j N / v < j + 1 N / ( j + 1 ) < v wird in den Eimer gestellt , also oder . Im ersten Fall ist was bedeutet, dass und somit .j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. Für gibt es höchstens Elemente in den Buckets von 1 bis .j<njj

    Sei und sei die Gesamtzahl der Elemente in einem der Buckets 1..j. Mit 2. haben wir, dass jedes Element in einem Bucket (mit ) so ist, dass . Daher ist die Summe aller Elemente in den Buckets von bis größer als . Aber diese Summe ist auch weniger als so und somit , die uns gibt oder .j<nkV i i j N / ( j + 1 ) N / ( i + 1 ) < v K 1 j k × N / ( J + 1 ) K N k × N / ( j + 1 ) < K N k / ( j + 1 ) <viijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T erfüllt (*), dh das te Element von ist so, dassjTT[j]N/j

    Nach 3. haben wir, dass , das te Element von , aus einem Bucket mit also .T[j]jTiijT[j]N/iN/j

  5. Dieser Algorithmus benötigt eine lineare Zeit.

    Die Berechnung von dauert linear. Buckets können mit einer verknüpften Liste implementiert werden, die -Einfügung und -Iteration aufweist. Die verschachtelte Schleife wird so oft ausgeführt, wie Elemente vorhanden sind (dh mal).NO(1)n


1
Die Frage nicht abzulehnen (+1, es ist eine gute Frage), aber würde die Radix-Sortierung nicht mehr tun, als Sie benötigen?
Mehrdad

@Mehrdad: Danke für deinen Kommentar! Radix-Sortierung würde die Ganzzahlen sortieren, aber es würde Zeit . O(nlog(maxivi))
a3nm

Könnten Sie kommentieren, was genau an dieser zeitlichen Komplexität unerwünscht ist? Haben Sie beispielsweise eine sehr große Ganzzahl und alles andere ist klein?
Mehrdad

1
@ a3nm radix sort ist nicht O (n log n), es ist O (n) und daher linear, wenn die Größe von ganzen Zahlen fest ist, zum Beispiel 32-Bit-Zahlen oder 64-Bit-Zahlen. Haben die von Ihnen sortierten Zahlen eine variable Größe?
Xavier Combelle

1
@ XavierCombelle: Ja, ich arbeite im RAM-Modell und kann nicht annehmen, dass die Eingabe-Ganzzahlen durch eine Konstante begrenzt sind.
a3nm

Antworten:


8

Das klingt sehr nach dem ASort-Algorithmus. Siehe diesen Artikel von Giesen et. al .:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

Leider ist die Laufzeit nicht ganz linear. Der obige Artikel beweist, dass jeder vergleichsbasierte randomisierte Algorithmus, der Elemente innerhalb von einstuft, eine Untergrenze von (unter der Annahme von ).n 2 / ν ( n ) n * l o g ( ν ( n ) ) ν ( n ) < nnn2/ν(n)nlog(ν(n))ν(n)<n


BEARBEITEN , als Antwort auf die Klarstellungen in der Frage:

Was Sie tun, ist einfach eine Eimersorte . Der Algorithmus für die Bucket-Sortierung ist in diesem Fall jedoch nicht linear. Das Problem: Sie müssen die natürlichen Zahlen summieren und dann für jede eine Division durchführen. Da die Anzahl unbegrenzt groß ist, ist keine zeitlich konstante Operation mehr. Je mehr Zahlen Sie summieren müssen, desto länger dauert die Ausführung.N/V[i]

Wie lange noch? Die Division hängt von der Anzahl der Stellen ab, also ist es mal Divisionsoperationen. Das kommt mir wahrscheinlich bekannt vor. :)nlg(n)n


1
Vielen Dank, dass Sie uns auf diesen Artikel hingewiesen haben! In der Tat hat es etwas mit der Frage zu tun. Allerdings ist mein Algorithmus (weder die Originalversion noch die etwas andere überarbeitete Version) ASort nicht so ähnlich. Erstens glaube ich, dass mein Algorithmus in läuft , nicht in superlinearer Zeit wie ASort. Zweitens unterscheidet sich das Kriterium (*) ziemlich von der Näherung der Fußregelentfernung nach Spearman. ZB ist das Kriterium (*) abhängig von den Werten der ganzen Zahlen mehr oder weniger eng, im Gegensatz zum Fußabstand. Drittens, obwohl sowohl unser Algorithmus als auch ASort Bucketing-Elemente sind, sind die Kriterien ziemlich unterschiedlich. O(n)
a3nm

@ a3nm Die Verdeutlichung der obigen Angaben lässt darauf schließen, dass Sie eine Bucket-Sortierung verwenden , die linear ist (und nicht auf Vergleichen basiert, dh zwei Elemente gegeneinander testet). Das Problem ist, dass es nicht für alle mathematischen ganzen Zahlen funktioniert. Dies funktioniert nur, wenn die Ganzzahlgröße begrenzt ist.
Trixie Wolf

Wenn Sie sagen "Es funktioniert nur, wenn die Ganzzahlgröße begrenzt ist", ist dies meiner Meinung nach nur dann der Fall, wenn ich die Ganzzahlen tatsächlich sortiere. Im Allgemeinen sortiert der von mir veröffentlichte Algorithmus sie jedoch nicht, sondern erzwingt nur das schwächere Kriterium (*). Ich denke also, es läuft in linearer Zeit, auch wenn die Ganzzahlgröße nicht begrenzt ist.
a3nm

2
@ a3nm Es ist nicht linear. Siehe meine erweiterte Antwort oben.
Trixie Wolf

Danke für die Antwort und entschuldige die Verspätung. Ich denke, es gibt einige Verwirrung um das Modell. Ich arbeite im RAM-Modell mit einem einheitlichen Zeitmaß (wie in van Emde Boas, Maschinenmodelle und Simulationen, im Handbuch der Berechnung): Die Zahlen, die ich manipuliere, können logarithmisch groß sein, aber arithmetische Operationen mit diesen Zahlen verursachen Stückkosten. Ich habe meine Frage entsprechend bearbeitet. Ich denke , dass in diesem Modell, der Algorithmus , dass ich vorschlagen , läuft wirklich in linearer Zeit (aber natürlich in diesem Modell der für Vergleichsbasis gebunden senken gilt nach wie vor Sortierung). nlogn
03.

2

Wie sich herausstellt, ist meine Frage doch ziemlich irrelevant. In der Tat arbeite ich an der RAM-Maschine mit einem einheitlichen Kostenmaß (dh, wir haben Register, deren Register nicht notwendigerweise von konstanter Größe sind, die aber höchstens Ganzzahlen logarithmischer Größe in der Eingabe speichern können, und Operationen an diesen Registern dauern konstant, einschließlich mindestens zusätzlich). Tatsächlich können in diesem Modell ganze Zahlen (durch im Wesentlichen Ausführen einer Radix-Sortierung) in linearer Zeit sortiert werden. Dies wird in der Arbeit von 1996 durch Grandjean, Sortieren, lineare Zeit und das Erfüllbarkeitsproblem erläutert .

(Dies beantwortet nicht meine Frage, ob es gut untersuchte Begriffe gibt, eine Menge von ganzen Zahlen "fast zu sortieren", aber damit sie interessant sind, müssten diese schwächeren Begriffe wahrscheinlich leichter durchgesetzt werden, dh an einer schwächeren gearbeitet werden Modell oder läuft irgendwie in sublinearer Zeit. Allerdings ist mir derzeit nicht bewusst, in welchem ​​Sinne dies der Fall wäre.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.