Sortieren mit einer Blackbox


20

Angenommen, wir wollen eine Liste von reellen Zahlen sortieren . Angenommen, wir erhalten eine Blackbox, mit der reelle Zahlen sofort sortiert werden können . Wie viel Vorteil können wir mit dieser Black Box gewinnen?n Snn

Können wir zum Beispiel die Nummern mit nur Aufrufen an die Blackbox sortieren ? Der beste Algorithmus, den ich gefunden habe, verwendet Aufrufe an die Blackbox. Aber ich habe es nicht weiter verbessern können. Hier ist mein Algorithmus, der ähnlich wie Merge-Sort ist:nO(n)n

Teilen Sie zuerst die Liste in Listen mit ungefähr Größe auf. Verwenden Sie dann Aufrufe an die Blackbox, um diese Listen zu sortieren. Zum Schluss führen Sie die sortierten Listen mit der Blackbox wie folgt zusammen:S s1,s2,. . . ,sns1,s2,...,snnn

Fügen Sie die kleinsten Elemente der Listen in eine neue Liste und rufen Sie die Blackbox auf, um sie zu sortieren. Die Zahl in (ersten und kleinstes Element ) wird die kleinste Zahl in seinem . Wir können es an die erste Stelle der Ausgabeliste setzen. Angenommen, das Element wurde aus , ersetzen wir durch das zweitkleinste Element der Sortierliste und führen erneut die Blackbox darauf aus, um das zweitkleinste Element von zu berechnen . Wir fahren fort, bis alle Elemente sortiert sind. Die Gesamtzahl der Blackbox-Anrufe für diesen Teil beträgtL [ 1 ] L S s j L [ 1 ] s j S n - LL[1]LS
sjL[1]sjS
nn-n. Daher beträgt die Gesamtzahl der Anrufe insgesamt .n

Auf der anderen Seite sollten wir in der Lage sein, eine Untergrenze zu erhalten, indem wir die Untergrenze für die für die Sortierung erforderlichen Zahlenvergleiche wie folgt verwenden: Wir können die Blackbox mit implementieren. Vergleiche. Wenn wir das Problem mit Aufrufen an die Blackbox lösen und in linearer Zeit zusammenführen können, können wir reelle Zahlen mit Vergleichen sortieren, was unmöglich ist.o(nlgn=12nlgnno(nlgn)O(n)nO(nlgn)

Ich denke, wir könnten beweisen, dass eine Untergrenze für die Anzahl der Aufrufe der Blackbox ist, da viele Vergleiche, die in der Blackbox verwendet werden, geteilt würden und daher in unserem Argument wiedergegeben werden.Ω(n)

UPDATE: Wie die anderen Posts andeuten, ist auch ein erreichbar.nlgn


2
Ihr Kommentar scheint einen Tippfehler zu enthalten. Meinten Sie: "Kein Algorithmus, der weniger als Aufrufe an die Maschine verwendet, kann reelle Zahlen mit weniger als Vergleichen sortieren "? ps: Sie sollten auch darauf achten, dass die untere Grenze von nur für vergleichsbasierte Sortieralgorithmen gilt. NNlgNNlgNNNNlgNNlgN
Kaveh

8
Ich denke, wir können sogar über das Sortiernetz von AKS. Ihr Netzwerk kann als Instanziierung Ihres Modells betrachtet werden, bei der die Blackbox Blöcke der Größe 2 sortieren kann. Ihre Algorithmen verwendenO(logn)-Runden, wobei jede Runde die 2-Sortierer-O(n)-Zeiten aufruft. Eine "Runde" vonO(n)2-Sortierern kann einfach mitO( √) simuliert werdenO(nLogn)O(Logn)O(n)O(n)O(n) Sortierer. n
Vinayak Pathak

6
@ VinayakPathak: Teilen Sie die Eingabedaten in Stücke der Größe2N, und sortieren Sie die Chunks mit dem AKS-Netzwerk, nachdem Sie jeden Komparator durch ein √ ersetzt habenN/2 Sorter. N
Jeffs

1
@ Jɛ ɛ E: Ja, toll, das sieht auf jeden Fall einfacher aus als meine Konstruktion.
Vinayak Pathak

1
@ Jɛ ɛ E, deine Kommentare können eine Antwort sein. :)
Kaveh

Antworten:


15

Es ist möglich mit O ( zu sortierenAnrufe an die Blackbox und keine Vergleiche.O(nLogn)

Betrachten Sie zunächst das folgende Problem der ausgeglichenen Partitionierung: gegebene Elemente A [ 1 .. m ] (wobei mEIN[1 ..m]), unterteilen Sie diese in zwei Gruppen, von denen die kleinste mindestens etwam/4beträgt, so dass alle Elemente in der ersten Gruppe kleiner sind als alle Elemente in der zweiten Gruppe. Dies kann mitO(m/ √ erfolgennmnm/4ruft die Blackbox an. (Das beschreibe ich später.) Dann benutze quicksort mit diesem Partitionierungsalgorithmus:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

Angenommen, jeder Partitionsschritt benötigt Aufrufe an die Blackbox, dem obigen Algorithmus, gegebenen EingangA[1 ..n], machenO(O(m/n)EIN[1 ..n]ruft die Blackbox auf, weil der Rekursionsbaum die TiefeO(logn) hatund jede Ebene des Baums insgesamtO(n/ √) hatO(nLogn)O(Logn)ruft die Blackbox an.O(n/n)=O(n)

Führen Sie den Partitionierungsschritt wie folgt aus:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

Verwenden Sie im letzten Schritt der Algorithmuspartition (): "Alle m Elemente um X partitionieren" nicht m zusätzliche Vergleiche?
Vinayak Pathak

2
Sehen Sie sich die Zeile direkt nach dem Algorithmus an und erfahren Sie, wie Sie diesen Schritt ausführen. Ich werde es bearbeiten, um das klarer zu machen.
Neal Young

24

Ich denke, Ihre Frage wurde in Beigels und Gills Artikel " Sortieren von n Objekten mit dem K-Sorter " aus dem Jahr 1990 angesprochen, und die Zusammenfassung des Artikels sagt schon alles:

Ein k-Sorter ist ein Gerät, das k Objekte in Zeiteinheiten sortiert. Die Komplexität eines Algorithmus, der einen K-Sortierer verwendet, wird als die Anzahl der Anwendungen des K-Sortierers definiert. In dieser Maßnahme liegt die Komplexität des Sortierens von n Objekten zwischen und4nlognnLognkLogk , bis zu Termen erster Ordnung in n und k.4nLognkLogk


Vielen Dank. Ich konnte das Papier nicht finden. Können Sie den Link zum Papier oder dessen Beweis angeben?
AmeerJ


Auch auf Citeseerx .
Kaveh

8
Beachten Sie, dass wenn , Beigel und Gill ist gebundenΘ(k=n. Θ(n)
Jeffs

12

Es ist möglich , zu sortieren obliviously mit ruft die Blackbox auf, die jeweils auf ein zusammenhängendes Subarray der ursprünglichen Eingabe angewendet wird. Der Algorithmus berührt die Eingabedaten nur durch Blackbox-Aufrufe. Insbesondere ist die gleiche Folge von Black-Box-Aufrufen nur eine Funktion vonn, nicht die tatsächlichen Eingangsdaten (daher "ahnungslos").O(nLogn)n

Hier ist eine Skizze eines einfacheren Algorithmus, der eine Blackbox verwendet, die Subarrays der Größe anstelle von nur sortiertk . Die Gesamtzahl der Anrufe an die Black Box beträgt ungefähr2(n/k)2. Zur Vereinfachung der Darstellung sei angenommen, dasskgerade und2n/keine ungerade ganze Zahl ist.n2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

Hier ist ein Diagramm des Algorithmus für und k = 4 . Die Daten werden von links nach rechts übertragen. jede box ist ein k- sorter.n=18k=4k

Bildbeschreibung hier eingeben

k/2k

O((n/k)2)O((n/k)Log2(n/k))=O(nLog2n)O((n/k)Log(n/k))=O(nLogn)


Ω(n lG(n))

2
O(n)

+1 für das schöne Bild! Ich kann mich irren, aber es scheint mir, dass es nicht ganz richtig ist (korrigieren Sie mich, wenn ich falsch liege). Angenommen, die Ausgabe erfolgt in aufsteigender Reihenfolge. Befindet sich das kleinste Element an der letzten Position, gibt es keinen "Pfad", auf dem es zur ersten Position "fahren" kann. Das Ändern von "für i = 1 zu m" zu "für i = 1 zu m + 1" scheint dies zu korrigieren, obwohl dies zu unnötigem Overhead führen kann.
George

@ George Ups, du hast recht; Ich brauche noch eine Schicht!
Jeffs
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.