Listensortierung als reines mathematisches Problem formulieren

Das Sortieren einer Liste ist ein klassisches Problem in der Informatik, und es wurden viele interessante Algorithmen wie Merge-Sort und Heap-Sort entdeckt.

Ich hätte gerne eine genaue Formulierung des Listensortierproblems als reines mathematisches Problem, damit ein hypothetischer reiner Mathematiker, der noch nie etwas von Computern gehört hat (wie zum Beispiel Gauß), das Problem lesen und verstehen kann , und erfinden dann Algorithmen wie Merge-Sort und Heap-Sort.

Eine Aussage wie „Entwickle einen Algorithmus zum Sortieren einer Liste von Zahlen in aufsteigender Reihenfolge“ ist unzureichend, weil sie nicht angibt, welche Grundoperationen der Algorithmus verwenden darf. Und es sagt auch nicht genau aus, was ein "Algorithmus" ist. Ja, es sollte etwas sein, das in Assemblercode implementiert werden kann, aber wir stellen das Problem für einen Mathematiker, der noch nie von einem Computer gehört hat.

Ist das Problem einmal genau formuliert, sollten sich Sätze wie „Die Worst-Case-Laufzeit des Quicksort-Algorithmus ist“ aufstellen und beweisen lassen Ö ( N 2 ) " mit einem Maß an Präzision und Strenge, das den Standards von, sagen wir, Baby Rudin entsprechen würde.

Frage: Wie würden Sie das Problem der Entwicklung eines Listensortieralgorithmus genau beschreiben?

Bonusfrage: Kennen Sie eine Referenz, die Listensortieralgorithmen als Thema in der reinen Mathematik präsentiert, mit einer Genauigkeit, die einen Autor wie Rudin zufrieden stellen würde?


Bearbeiten: Dies könnte die Frage spezifischer machen. Der Anfang von Kapitel 8 von Introduction to Algorithms von Cormen et al. [S. 191 in der dritten Auflage] heißt es:

Diese Algorithmen haben eine interessante Eigenschaft gemeinsam: Die von ihnen ermittelte sortierte Reihenfolge basiert nur auf Vergleichen zwischen den Eingabeelementen . Wir nennen solche Sortieralgorithmen Vergleichssortierungen . Alle bisher vorgestellten Sortieralgorithmen sind Vergleichssortierungen.

In Abschnitt 8.1 werden wir beweisen, dass jeder Vergleich sortieren muss Ω ( N lg N ) Vergleiche im schlimmsten Fall zu sortieren N Elemente.

Spezifischere Frage: Wie würden Sie diese Aussage genau als mathematisches Theorem formulieren - die Tatsache, die jeder Vergleichstyp machen muss Ω ( N lg N ) Vergleiche im schlimmsten Fall. Um dies rigoros zu machen, müssen wir entweder genau definieren, was eine "Vergleichssortierung" ist, oder es vermeiden, den Begriff vollständig zu verwenden.

Wir gehen davon aus, dass es einen Algorithmus gibt, der zwei beliebige Elemente auf der Liste vergleichen und etwas zurückgeben kann, das angibt, welches das größere ist. Anschließend vergleichen wir Sortiertechniken basierend darauf, wie viele Aufrufe der Algorithmus hat. Das scheint mir eine feine Spezifikation zu sein.
@RossMillikan Wäre es Ihnen beispielsweise erlaubt, das Element in Position zu verschieben J positionieren ich In der Liste? Ist das eine Grundoperation, die erlaubt ist, oder muss sie durch eine Kombination anderer Grundoperationen erreicht werden?
Sie dürfen die Liste im Allgemeinen beliebig manipulieren. Die Annahme ist, dass dies im Vergleich zum Vergleichen von Elementen keine Zeit in Anspruch nimmt.
Dies ist jedoch keine genaue Aussage. Was bedeutet "wie du willst". Auch wenn die Liste ein Array von Zahlen im Computerspeicher ist, verschieben Sie das Element in Position J in Position ich erfordert das Verschieben einer Menge Dinge im Speicher (weil viele Elemente im Array um eine Position verschoben werden müssen), und es ist nicht klar, dass diese Kosten vernachlässigbar sind.
Das zu suchende Schlüsselwort ist "Modell der Berechnung". Diese Frage lautet im Grunde: "Was sind die spezifischen Berechnungsmodelle für das Sortierproblem?"
"Ich hätte gerne eine genaue Formulierung des Listensortierproblems als reines mathematisches Problem, damit ein hypothetischer reiner Mathematiker, der noch nie etwas von Computern gehört hat (wie Gauß, sagen wir)" das Wort "Computer" ursprünglich bezeichnete Menschen, die Berechnungen anstellten, manchmal für Mathematiker. Gauß hat wahrscheinlich Computer eingesetzt und Algorithmen erfunden, denen sie folgen konnten, wie viele Mathematiker.
Solange die Zahlen tatsächlich verglichen werden können und die Liste endlich ist, wo ist das Problem? Wenn wir uns nicht um Geschwindigkeit kümmern, hätte sogar jemand aus der Steinzeit eine Methode entwickeln können, um sie zu lösen und anzuwenden, dh einen Algorithmus zu etablieren (obwohl dieses Wort zu dieser Zeit möglicherweise unbekannt war). Ich sehe wirklich nicht den Sinn dieser Frage.
@Peter Angenommen, wir sortieren Prüfungen (Papiere, zu denen die Schüler Lösungen geschrieben haben) nach der in der Prüfung geschriebenen Punktzahl, und wir haben die Prüfungen in einer Linie auf dem Boden verteilt. Wenn wir die Positionen zweier Prüfungen tauschen wollen, geht das schneller, wenn die Prüfungen räumlich näher beieinander liegen. Sollte dieses Detail in die Problemstellung aufgenommen werden? Ist das Austauschen der einzige zulässige Vorgang oder können wir beispielsweise eine einzelne Untersuchung an einer anderen Stelle in der Liste einfügen? Auch wenn es einfach ist, das Problem zu formulieren, sollten wir es dennoch präzise formulieren. Ich würde gerne deine Formulierung hören.
@Peter „Wenn wir uns nicht um Geschwindigkeit kümmern“ Wir kümmern uns um Geschwindigkeit – wir wollen Algorithmen finden, die in gewissem Sinne eine minimale Anzahl von Operationen ausführen, während sie eine Liste sortieren. Aber diese Aussage muss präzisiert werden.

Antworten (4)

Es gibt mehrere mathematische Studien zu Sortieralgorithmen, ausgehend von Knuths Bibel [3] zu diesem Thema. Das Handbook [2] bietet auch einen rigorosen Ansatz für Algorithmen und gibt eine Reihe von Referenzen.

Ich werde nicht versuchen, die 790 Seiten von Knuths Band in wenigen Zeilen zusammenzufassen, aber hier sind einige Punkte, die für einen mathematischen Ansatz zum Sortieren zu berücksichtigen sind.

  1. Sie erhalten eine völlig geordnete N -Elementsatz S = { A 1 < A 2 < < A N } . Am Anfang steht das zu sortierende Array ( A σ ( 1 ) , A σ ( 2 ) , , A σ ( N ) ) , Wo σ ist eine Permutation von { 1 , , N } .
  2. Normalerweise misst die (Zeit-)Komplexität die Anzahl der Vergleiche, die zum Sortieren des Arrays erforderlich sind. Kein anderer Parameter wird berücksichtigt. So sind Vergleiche der Form „ist A < B ?" sind die einzigen grundlegenden Operationen, die berücksichtigt werden. Auf diese Weise ist das Problem völlig unabhängig von der Implementierung.
  3. Es gibt mehrere Komplexitätsmaße, einschließlich Zeitkomplexität (einschließlich Worst-Case-Zeitkomplexität ), durchschnittliche Zeitkomplexität , Raumkomplexität (die die von Ihrem Algorithmus verwendete Speichermenge misst), ganz zu schweigen von der neueren amortisierten Rechenkomplexität . In Ihrer Frage scheinen Sie an der Zeitkomplexität im schlimmsten Fall interessiert zu sein.
  4. [BEARBEITEN] Die minimale Anzahl von Vergleichen, die zum Sortieren benötigt werden N Elemente ist die OEIS-Sequenz A036604 . Siehe [4] für einen aktuellen Beitrag zu diesem Thema.

In einem Kommentar behaupten Sie das

wenn die Liste ein Array von Zahlen im Computerspeicher ist, Verschieben des Elements in Position J in Position ich erfordert das Verschieben einer Menge Dinge im Speicher (weil viele Elemente im Array um eine Position verschoben werden müssen).

Das ist nicht wahr. Sie können zum Beispiel mit Zeigern in C (oder Referenzen in Java) herumspielen. Darüber hinaus basieren eine Reihe von Sortieralgorithmen auf dem Vertauschen zweier Positionen ich Und J , die keine Verschiebung benötigt. Um sich mit Algorithmen vertraut zu machen, ist [1] eine der Standardreferenzen, aber es gibt noch viele andere.

[1] Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L. und Stein, Clifford. Einführung in Algorithmen. Dritte Edition. MIT Press, Cambridge, MA, 2009. xx+1292 S. ISBN: 978-0-262-03384-8

[2] Gonnet, Gaston H. und Baeza-Yates, R., Handbuch der Algorithmen und Datenstrukturen . 2. Aufl. (Englisch) International Computer Science Series. Bonn etc.: Addison-Wesley Publishing Company. XIV, 424 S. (1989).

[3] Knuth, Donald E. Die Kunst der Computerprogrammierung . Vol. 3. Sortieren und Suchen . Zweite Ausgabe. Addison-Wesley, Reading, MA, 1998. xiv+780

[4] Peczarski, Marcin (3. August 2011). Auf dem Weg zur optimalen Sortierung von 16 Elementen . Acta Universitatis Sapientiae 4 (2): 215–224

Danke für die Antwort. Nehmen wir an, wir haben ein Array (ein zusammenhängender Block des Computerspeichers), das die Werte speichert 3 , 1 , 7 , 3 , 5 , 9 , 2 . Und wir wollen das Element von Position 6 auf Position 2 verschieben, also werden jetzt die Werte im Array sein 3 , 1 , 2 , 7 , 3 , 5 , 9 . Dazu müssen Sie eine Menge Dinge im Speicher verschieben, richtig?
Dies hat nichts mit Ihrer Frage zu tun, da dies von der von Ihnen verwendeten Datenstruktur abhängt. Ein Array ist nicht unbedingt ein zusammenhängender Speicherblock. Sie können die Adressen der perfekt sortieren N Elemente Ihres Arrays und kopieren Sie dann alles in einen neuen Speicherblock, wenn Sie dies ganz am Ende wünschen.

Allgemeine Probleme mit der Angabe vergleichsbasierter Algorithmen als reines mathematisches Problem

Schauen Sie sich die Diskussionen über vergleichsbasierte Algorithmen an (eine Klasse von Algorithmen, die die meisten Sortieralgorithmen umfasst) [0]. Es ist ein guter Ausgangspunkt für eine Formalisierung, auch wenn die Definition dieser Algorithmen in der Literatur zu vage bleibt, um einen reinen Mathematiker zufrieden zu stellen.

Ihre Frage, was einen Algorithmus ausmacht und was die grundlegenden Operationen sind, wird in [0] und [4] beantwortet. Für imperative Programmiersprachen sind grundlegende Operationen typischerweise die Operationen auf niedrigerer Ebene, die von Konstrukten auf höherer Ebene ausgeführt werden (wie Schleifen, Bedingungen usw.). Diese können von vornherein bei der Angabe einer Sprache angegeben werden.

Eine gängige „Definition“ ist, dass vergleichsbasierte Algorithmen Algorithmen sind, bei denen jede grundlegende Operation (Austausch, Zuweisung usw.) auf einem vorherigen Vergleich (oder einer Folge von Vergleichen) basieren muss. Diese Definition von vergleichsbasierten Algorithmen hat eine Lücke (nicht die einzige.) Was wirklich zählt, ist, dass die grundlegenden Operationen auf der Grundlage des transitiven Abschlusses des Ergebnisses früherer Vergleiche entschieden werden.

Ein zweites zu untersuchendes Problem ist die Beziehung zwischen vergleichsbasierten Algorithmen und Teilauftragsproduktion (dies hilft bei Ihrer Frage zu den unteren Grenzen). In Lehrbüchern wird dies selten erwähnt. Partial Order Production ist (neben anderen Aspekten) ein Ansatz zur Festlegung allgemeinerer Untergrenzen für vergleichsbasierte Algorithmen, die keine Sortieralgorithmen sein müssen[1]. Die Teilauftragsproduktion beinhaltet das unten diskutierte topologische Sortiermodell.

Ein drittes Problem (für Mathematiker) ist die Spezifikation der beteiligten Operationen. Die engste Präsentation wäre Knuths Band III über das Sortieren und Suchen (The Art of Computer Programming, Band III), eine ausgezeichnete Ressource, die bereits stromaufwärts erwähnt wurde. Selbst bei dieser Genauigkeit wird ein reiner Mathematiker vom Detail weg abstrahieren wollen, was eine Herausforderung für sich ist. Siehe unten über die Spannung zwischen Code und Mathematik.

Ein viertes Problem ist die Unterscheidung zwischen impliziten Datenstrukturen [2] und expliziten. Für den Fall der Haufensortierung wird typischerweise die Datenstruktur der Liste (Array) verwendet. Die implizite Datenstruktur ist jedoch die eines Heaps, die der Programmierer beim Schreiben des Codes im Kopf hat, obwohl die Heap-Datenstrukturen nicht explizit im Code verwendet werden (es werden nur Arrays verwendet).

Schließlich gibt es noch den Status der Algorithmenanalyse im Allgemeinen, der eine Mischung aus reiner und angewandter Mathematik bleibt. Viele Techniken sind auf den betrachteten Algorithmus zugeschnitten. Es gibt kein einheitliches Vorgehen. Knuths TAOCP Vol III hätte die detailliertesten Informationen zu einem formalen Ansatz (sei es mit Methoden, die immer noch auf verschiedene Algorithmen zugeschnitten sind). Flajolets Arbeit an der Algorithmusanalyse kann als ein Weg zur Vereinheitlichung angesehen werden (obwohl die verwendeten Operationen manchmal von den üblicherweise in der Informatik verwendeten Operationen abweichen, um sicherzustellen, dass Erzeugungsfunktionen angewendet werden können. Dies führt wie immer zu einer Spannung zwischen Informatik und Mathematik Schuhhorn-Code, um die Mathematik anzupassen). Ich habe ein Buch zu diesem Thema geschrieben, das sich auf eine vereinheitlichende Theorie konzentriert und näher an der Standardberechnung bleibt [3].

Es bleibt noch viel zu tun, um die Theorie auf die richtige Abstraktionsebene zu bringen, um die Erwartungen eines reinen Mathematikers zu erfüllen (Ihre ursprüngliche Frage, glaube ich). Das Spiel soll Klarheit und Präzision ausbalancieren und eine Vereinheitlichung erreichen, während die eigentlichen Ziele der Disziplin (in diesem Fall CS) respektiert werden.

Es scheint, dass sich Ihre Fragen auch darauf beziehen, was auf Hardwareebene passiert. Ich würde A Guide to Experimental Algorithmics [4] empfehlen. Dieser Bereich ist ein Mittelweg zwischen rein experimenteller algorithmischer Analyse (zu maschinenabhängig) und theoretischer Analyse (maschinenunabhängig, aber in gewisser Weise zu weit von der Praxis entfernt). Es verwendet Techniken, die einer kontrollierten Laborumgebung in der Informatik ähneln.

Die obigen Skizzen zeigen, warum die formale Definition vergleichsbasierter Algorithmen herausfordernd ist. Es kann getan werden. Zum Beispiel tut es [3] für eine eingeschränkte Klasse (die speziell darauf abzielt, modulares Average-Case-Timing zu realisieren). [1] vertritt die Ansicht, dass alle vergleichsbasierten Algorithmen Berechnungen haben, die (für Listen fester Größe N ) können durch Entscheidungsbäume modelliert werden. [1] vertritt daher die Ansicht, dass die Algorithmen mit den Bäumen identifiziert werden (dh die Algorithmen zur Teilauftragsproduktion in [1] werden einfach als Entscheidungsbäume mit bestimmten Eigenschaften aufgefasst). Sobald dieser Sprung gemacht ist, entsteht der reine mathematische Kontext, basierend auf Entscheidungsbäumen und topologischen Sortierungen. Es umgeht Ihre Frage nach einem formalen Rahmen, in dem allgemeine vergleichsbasierte Berechnungen so formuliert sind, dass sie einen reinen Mathematiker (oder beispielsweise einen theoretischen Informatiker) zufrieden stellen. Ich glaube, dass es durchaus machbar ist, dh eine Logik sollte machbar sein, in der vergleichsbasierte Berechnungen erfasst werden. Ich kenne keine Referenz, die dies tut (und wäre interessiert, wenn jemand eine hat).

Ein Ausgangspunkt, um die reine mathematische Formulierung anzusprechen [1,3,5]

Der folgende Ansatz kann als rein mathematische Formulierung des Problems angesehen werden. Es ist verwandt mit Yaos Ansatz in [1] sowie dem Ansatz in [3], wo beide topologische Sortierungen verwenden, um vergleichsbasierte Berechnungen zu modellieren. Anstatt sich auf den Code zu konzentrieren, liegt der Fokus auf den Eingabe-Ausgabe-Funktionen, die mit den durchgeführten Operationen verbunden sind im Code (ein semantischer Ansatz).

Die Einsatzregel des Designers: transitive Schließung

Eine übliche Definition von vergleichsbasierten Algorithmen ist, dass jede Grundoperation (Austausch, Zuweisung usw.) auf einem vorherigen Vergleich oder einer Folge von Vergleichen basieren muss. Diese Definition hat eine unglückliche Lücke. Was wirklich zählt, ist, dass die Grundoperationen auf der Grundlage des transitiven Abschlusses des Ergebnisses früherer Vergleiche entschieden werden. Lassen k 2 .

Bei einem Sortieralgorithmus wie Bubble Sort ist jeder Austausch zwischen Listenelementen das direkte Ergebnis eines Vergleichs zwischen diesen beiden Elementen. Für Quicksort zwei Elemente A , B kann mit einem Schwenkelement verglichen werden P , und kann auf dieser Grundlage ausgetauscht werden A > P Und P > B wenngleich A Und B noch nie direkt verglichen. Der Austausch wird auf der Grundlage des transitiven Abschlusses der gewonnenen Informationen über die Anordnung der Elemente bis zu diesem Zeitpunkt der Berechnung durchgeführt. In diesem Stadium der Berechnung kennt der Algorithmusdesigner alle Ordnungsbeziehungen zwischen verglichenen Labelpaaren sowie alle legitim gefolgerten Ordnungsbeziehungen, dh erhalten durch transitiven Abschluss. Es ist diese Sammlung von Beziehungen, und nur diese Sammlung, die die Entscheidungen des Designers unterstützt, die Ausführung grundlegender Codeoperationen einzubeziehen.

Der Entwurf jedes vergleichsbasierten Algorithmus erfordert, dass nach jedem in der Berechnung durchgeführten Vergleich ein Austausch oder ein anderer grundlegender Berechnungsschritt auf der Grundlage der durch die vorherigen Vergleiche festgelegten Reihenfolge durchgeführt wird. Diese Reihenfolge betrifft den transitiven Abschluss aller Paare, für die die richtige Reihenfolge bestimmt wurde. Dies legt die Einsatzregeln für den Algorithmusdesigner fest, der den Algorithmus niemals dazu bringen kann, eine grundlegende Operation außerhalb dieses Kontexts auszuführen.

Beachten Sie, dass es für den Designer nicht erforderlich ist, Austauschvorgänge in Übereinstimmung mit einer bestimmten Reihenfolge vorzunehmen. Der Designer muss sicherstellen, dass der Algorithmus die richtigen Ausgaben erzeugt. Ob ausgeführte Swaps den Algorithmus diesem Ziel näher bringen oder nicht, ist eine Entscheidung, die getroffen werden muss, aber keine Entscheidung, die erzwungen wird. Einzige Voraussetzung ist, dass am Ende eine „Soll“-Ordnung erreicht wird (vorgegeben als Teil der Spezifikation für den Algorithmus). Um eine Zielreihenfolge vorzugeben, die am Ende erreicht werden muss, wird das topologische Sortiermodell eingeführt.

Bestellinformationen filtern und Daten entsprechend permutieren

Jeder Vergleich, der während einer vergleichsbasierten Berechnung durchgeführt wird, bestimmt, ob zwei Labels in der richtigen oder falschen Reihenfolge auftreten . Jeder Vergleich filtert ein zusätzliches Informationsbit aus den Daten heraus: 0 für ein Paar außerhalb der Reihenfolge und 1 für ein Paar in der richtigen Reihenfolge.

Wenn ein Vergleich zwischen zwei Labels durchgeführt wurde A Und B das festzustellen A B In der linearen Reihenfolge auf Etiketten beziehen wir uns auf das Paar ( A , B ) als gefiltertes Paar . Falls A B etabliert ist, beziehen wir uns auf das Paar ( B , A ) als gefiltertes Paar .

Die festgelegte Eingabereihenfolge

Für jede Ausführung eines vergleichsbasierten Algorithmus an einer Eingabe ICH und bei jedem Vergleich, der bei dieser Ausführung durchgeführt wird, ist die festgelegte Eingabereihenfolge (bis zu diesem Punkt in der Berechnung) die Teilreihenfolge, die durch Nehmen des transitiv-reflexiven Abschlusses der gefilterten Paare erhalten wird, die während der Berechnung bis einschließlich dieses Vergleichs erhalten werden.

Die Eingabereihenfolge ist die partielle Eingabereihenfolge, die erreicht wird, wenn die Ausgabe für erzeugt wird ICH , dh die festgelegte Eingabereihenfolge für den zuletzt durchgeführten Vergleich.

Bei der Ausführung eines vergleichsbasierten Algorithmus können zwei Etiketten ausgetauscht (oder unter Verwendung anderer grundlegender Operationen verschoben) werden. Ein Swap ist eine Permutation, die eine einzelne Transposition der Eingabedaten darstellt und zwei Labels austauscht.

Vergleichsbasierte Algorithmen werden ausgeführt von:

  • (implizites) Filtern der Daten über Vergleiche und
  • (explizites) Permutieren von Daten nur unter Verwendung von Swaps (oder anderen grundlegenden Operationen) an Paaren, die in der festgelegten Eingabereihenfolge enthalten sind.

Der Filterprozess

Der Filterprozess sammelt implizit mehr Informationen über die lineare Reihenfolge einer Eingabe auf Labels. Diese Informationen werden durch die festgelegte Eingabereihenfolge erfasst. Der Filterprozess partitioniert auch die Eingaben in Sätze, die die festgelegte Eingabereihenfolge erfüllen.

Betrachten Sie jede vergleichsbasierte Sortierung und jede Eingabeliste L von Größe N der Einfachheit halber verschiedene Elemente zu speichern. Einmal wird ein erster Vergleich durchgeführt, um die Reihenfolge zwischen zwei Listenelementen zu bestimmen L [ ich ] Und L [ J ] mit ich < J , werden die möglichen Eingaben, für die diese Entscheidung getroffen wird, halbiert (von N ! Zu N ! 2 Listen). Diese Eingaben betreffen jetzt nur noch die Listen für die L [ ich ] < L [ J ] ob dies das Ergebnis des Vergleichs war, oder die Listen für die L [ J ] > L [ ich ] ansonsten.

Vergleichsbasierte Sortieralgorithmen sammeln nach und nach Informationen über Paarreihenfolgen, die in der etablierten Eingabereihenfolge für die Elemente einer Liste erfasst werden. An jedem Punkt der Berechnung, dh nach jedem Vergleich, kann diese Reihenfolge interpretiert werden, um die Eingangslisten herauszufiltern, die der bis dahin festgelegten Reihenfolge nicht genügen.

Der Prozess des Herausfilterns von Eingaben, die die etablierte Reihenfolge nicht erfüllen, ist implizit. Es ist nicht Teil des Codes. Es ist jedoch Teil des beabsichtigten Entwurfs des Programmierers für den Algorithmus.

Der Permutationsprozess

Der Permutationsprozess wird von jedem vergleichsbasierten Algorithmus ausgeführt, wie durch seinen Code bestimmt . Für jede Eingabe kann ein vergleichsbasierter Algorithmus eine Reihe von Austauschvorgängen (oder allgemeiner grundlegende Operationen) an Labelpaaren ausführen. Die Zusammensetzung dieser Swaps bildet eine Permutation, die die ursprüngliche Eingabe in eine Ausgabe umwandelt. An dieser Stelle konzentrieren wir uns ausschließlich auf vergleichsbasierte Sortieralgorithmen.

Nach jedem Vergleich hat jeder vergleichsbasierte Sortieralgorithmus die Möglichkeit, Datenetiketten zu permutieren, damit sie in die beabsichtigte sortierte Reihenfolge der Ausgabelisten passen. Beispielsweise listet if Elemente auf L [ ich ] Und L [ J ] durch eine vergleichsbasierte Sortierung bestimmt werden, dass sie außerhalb der Reihenfolge auftreten, d. h L [ J ] > L [ ich ] Wo ich < J , dann kann ein Austausch vorgenommen werden, um ihre relative Reihenfolge in Übereinstimmung mit der zu berechnenden sortierten Ausgabe zu bringen.

Für jede vergleichsbasierte Sortierung hat der kombinierte Prozess der Eingabefilterung und Eingabepermutierung den folgenden Effekt:

  • Zu dem Zeitpunkt, an dem eine Ausgabe berechnet wurde, wurden die möglichen Eingaben auf eine einzige Liste heruntergefiltert.

  • Der vom Algorithmus auf dieser Eingabe durchgeführte Permutationsprozess, dh die Zusammenstellung der bis dahin auf der Eingabe durchgeführten Sammlung von Swaps, erzeugt die sortierte Ausgabe.

Dies führt natürlich zu dem folgenden mathematischen Modell, das "Quell"- und "Ziel"-Ordnungen für vergleichsbasierte Berechnungen erfasst.

Das topologische Sortiermodell

Das mathematische Modell

Das mathematische Modell für vergleichsbasierte Algorithmen [1] und [3] besteht aus zwei Teilen:

(a) Modellieren von Datenstrukturen als teilweise geordnete endliche Mengen;

(b) Modellieren von Daten auf diesen nach topologischen Sortierungen;

Aus dieser Sicht hat eine abstrakte Spezifikation eines Sortieralgorithmus einen Eingangszustand, der durch jede mögliche Permutation einer endlichen Menge von Elementen (dargestellt gemäß (a) und (b) durch eine diskrete, teilweise geordnete Menge zusammen mit ihren topologischen Sortierungen, gegeben ist gegeben durch alle Permutationen) und geben eine sortierte Liste von Elementen aus (dargestellt wiederum gemäß (a) und (b) durch eine linear geordnete endliche Menge mit ihrer eindeutigen topologischen Sortierung).

Beispiel 1: Die (ungeordneten) Eingabelisten der Größe 2 eines Sortieralgorithmus werden durch die topologischen Sortierungen einer diskreten Ordnung der Größe 2 über der Menge der Elemente modelliert { X 1 , X 2 } :

{ ( X 1 : 1 , X 2 : 2 ) , ( X 1 : 2 , X 2 : 1 ) }

Die Funktionswerte S ( X 1 ) = 2 Und S ( X 2 ) = 1 von, sagen wir, der topologischen Sorte S = ( X 1 : 2 , X 2 : 1 ) (über der diskreten Ordnung der Größe 2) werden als Etiketten bezeichnet und entsprechen im Fall einer Listendatenstruktur den Elementen der Liste. Der Standort ich eines Etiketts A wofür S ( X ich ) = A wird als Index des Labels bezeichnet und entspricht der Position eines Elements in einer Liste. Die Liste ( 2 , 1 ) enthält das Element 2 an Position 1 (also den Index von X 1 ) und das Element 1 an Position 2 (also der Index von X 2 ). Wir sagen, dass für diese topologische Sortierung der Index von Label 2 1 und der Index von Label 1 2 ist. Die 2! topologische Sorten { ( X 1 : 1 , X 2 : 2 ) , ( X 1 : 2 , X 2 : 1 ) } bestehen aus 2 Permutationen, die die ungeordneten Listen darstellen ( 1 , 2 ) Und ( 2 , 1 ) . Diese topologischen Sortierungen bilden die Wurzelzustände, in denen Listen der Größe 2 (mit unterschiedlichen Elementen) vorkommen können. Tatsächlich ist eine Liste der Größe 2 entweder sortiert, dargestellt durch ( 1 , 2 ) , oder umgekehrt sortiert, dargestellt durch ( 2 , 1 ) . Zusammen bilden diese topologischen Sorten den Zustandsraum . Ein Zustandsraum dient intuitiv dazu, die gleichmäßige Verteilung über die Daten darzustellen: jede der unendlich vielen möglichen Eingabelisten ( A , B ) der Größe 2 (mit unterschiedlichen Elementen) mit gleicher Wahrscheinlichkeit in einem der beiden Wurzelzustände des Zustandsraums auftritt. Diese Interpretation dient dazu, die traditionelle Komplexitätsanalyse von Algorithmen zu untermauern, die von einer Gleichverteilung ausgeht.

Beispiel 2: Triviale Art von Listen der Größe 2

Berechnungen werden topologische Sortierungen in neue topologische Sortierungen umwandeln. Alle Berechnungen basieren auf Vergleichen. Stellen Sie sich zum Beispiel einen Sortieralgorithmus vor, sei es ein sehr primitiver, der nur über Listen der Größe 2 arbeitet und einen einzigen Vergleich mit den beiden Elementen der Liste (den Labels der entsprechenden topologischen Sortierung) durchführt. Auf diesen Vergleich folgt ein Austausch der Etiketten, falls diese Etiketten nicht in Ordnung sind. Ein solcher Algorithmus verlässt die topologische Sortierung ( X 1 : 1 , X 2 : 2 ) unverändert und transformieren die topologische Sortierung ( X 1 : 2 , X 2 : 1 ) über einen einzigen Swap zur topologischen Sortierung ( X 1 : 1 , X 2 : 2 ) . Das Sortieren in diesem Modell erzeugt die eindeutige topologische Sortierung über der linearen Ordnung.

Teil (a) der Modellbeschreibung legt fest, dass wir endliche Teilordnungen verwenden, um Datenstrukturen darzustellen. Diese Reihenfolge kann abhängig von der Implementierung implizit oder explizit in der Ausgangsdatenstruktur dargestellt werden. Beispielsweise kann im Fall einer Haldenbildung aus einer ungeordneten Eingabeliste die Berechnung die Halde explizit aufbauen, indem die Eingabeliste in eine binäre Baumdatenstruktur transformiert wird, die die Haldeneigenschaft erfüllt, und de facto eine Halde bildet. Alternativ kann der Algorithmus eine Eingabeliste nehmen und die Listendatenstruktur für seine Ausgaben beibehalten. Elemente der Eingabeliste werden an Ort und Stelle neu organisiert, dh es wird eine neue Liste erzeugt, deren Elemente einer Heap-Struktur genügen. Die diesem Heap zugrunde liegende Baumstruktur bleibt ein "impliziter" Teil der Implementierung. Der Algorithmus verwendet für alle Zwecke die vom Programmierer beabsichtigte Heap-Struktur, aber die Datenstruktur bleibt während der Berechnung jederzeit eine Liste. Dies Dies ist beispielsweise beim Heapify-Prozess im traditionellen (in-place) Heapsort der Fall. Wir bezeichnen in diesem Fall die Heap-Struktur als implizite Datenstruktur und die Listendatenstruktur als explizite Datenstruktur . Diese können übereinstimmen oder nicht, je nachdem von der Implementierung ab.In unserem Kontext modellieren Teilaufträge die implizite Datenstruktur.

Ein grundlegendes Beispiel für das Rechenmodell: Sortieralgorithmen

Wir veranschaulichen (a), (b) des Modells für einen Sortieralgorithmus, der über Größenlisten arbeitet N .

Für Sortieralgorithmen sind Eingaben Listendatenstrukturen, die durch endliche diskrete Ordnungen dargestellt werden. Die Elemente der Ordnung werden mit positiven ganzen Zahlen beschriftet, die aus einem linear geordneten Beschriftungssatz gezogen werden L , was in diesem Fall die übliche lineare Ordnung der positiven ganzen Zahlen ist. Die einzige Anforderung an diese Kennzeichnung ist, dass ihre Kombination mit der diskreten Ordnung eine topologische Sortierung bildet.

Es ist möglich, mit Listen umzugehen, die sich wiederholende Elemente enthalten. Diese müssten durch topologische Sortierungen modelliert werden, für die die Bedingungen gelockert werden, um wiederholte Kennzeichnungen zu ermöglichen. Siehe [3] für eine Diskussion darüber, wie wiederholte Labels durch die Zuweisung zufälliger Tie-Breaker gehandhabt werden können. Es ist Standardpraxis in der algorithmischen Analyse, die Analyse in erster Instanz für Listen ohne doppelte Elemente durchzuführen – ein Ansatz, der hier gewählt wird.

Sortieralgorithmen transformieren daher topologische Sortierungen der diskreten Ordnung (Permutationen) in die eindeutige topologische Sortierung der linearen Ordnung (die sortierte Liste).

Sortieralgorithmen sind eine restriktive Art von vergleichsbasierten Algorithmen. Die Eingaben sind ungeordnete Größenlisten N die vorkommen in N ! mögliche Zustände. Die Ausgaben erfolgen in genau einem Zustand, der sortierten Ausgabeliste [ 1 , 2 , 3 , , N ] .

Wir betrachten allgemeinere vergleichsbasierte Algorithmen, die mit Eingaben und Ausgaben arbeiten, die keine Listendatenstruktur sein müssen.

Quelle und Ziel eines Algorithmus

Betrachten Sie eine Sequenz a = ( a N ) N von endlichen Posets der Größe N und eine Folge β = ( β N ) N von Verfeinerungen von ( a N ) N , dh a N verfeinert die Reihenfolge β N für jeden N . Das Paar ( a , β ) wird eine Verfeinerung mit einer Quelle genannt a = ( a N ) N und ein Ziel β = ( β N ) N .

Ein Algorithmus A erkennt die Verfeinerung ( a , β ) falls:

die Eingaben der Größe N , als Menge betrachtet, bilden den Zustandsraum über der Quellordnung a . Erinnern Sie sich daran für jeden endlichen Poset a , der Zustandsraum Σ ( a ) ist die Menge aller topologischen Sorten mit Labels in { 1 , , N } Wo N = | a | .

die entsprechenden Ausgänge, als Menge betrachtet, bilden den Zustandsraum Σ ( β N ) .

Σ ( a N ) wird als Quellraum bezeichnet (für Eingaben von size N ).

Σ ( β N ) wird als Zielraum bezeichnet (für Eingaben von size N ).

Mit etwas Missbrauch der Terminologie: if a = ( a N ) N ist die Quelle eines solchen vergleichsbasierten Algorithmus A und wir berücksichtigen Größeneingaben N , Dann a N wird auch als „die Quelle“ bezeichnet.

Man kann einen vergleichsbasierten Algorithmus als einen Algorithmus betrachten, der grundlegende Operationen ausschließlich auf der Grundlage des transitiven Abschlusses früherer Vergleiche ausführt, Filterung und Permutation in jeder Stufe, so dass für eine gegebene Quelle a und ein Verfeinerungsziel β , realisiert der Algorithmus die Verfeinerung. Alternativ kann man vom Code abstrahieren und sich ganz auf Entscheidungsbäume konzentrieren [1].

Beispiel: Für einen vergleichsbasierten Sortieralgorithmus A die Quelle ist die Sequenz Δ = ( Δ N ) N von diskreten Größenordnungen N und das Ziel ist die Sequenz L = ( L N ) N von linearen Größenordnungen N .

Für den vergleichsbasierten Algorithmus heapify, der ungeordnete Größenlisten transformiert N zu Haufen ist die Quelle die Folge diskreter Ordnungen Δ = ( Δ N ) N . Das Ziel ist die Sequenz H = ( H N ) N Wo H N ist das Poset, das durch das Hasse-Diagramm eines Haufens der Größe bestimmt wird N .

Das topologische Sortiermodell untermauert Komplexitätsuntergrenzen für allgemeine vergleichsbasierte Algorithmen (dh Algorithmen, die keine Sortierungen sein müssen).

Das Entropieverhältnis

Wenn A ist ein vergleichsbasierter Algorithmus mit Größeneingaben N auftreten k Zustände und Ausgaben, die in auftreten l gibt dann die Quellenentropie (also die Eingangsentropie) an H A S ( N ) = l Ö G 2 k und die Zielentropie H A T ( N ) = l Ö G 2 ( l ) .

Entropisches Verhältnis (ER) Es wird angenommen, dass sowohl die Quellzustände als auch die Zielzustände mit gleicher Wahrscheinlichkeit auftreten, dh gleichmäßig verteilt sind.

Betrachten Sie einen vergleichsbasierten Algorithmus A mit Eingängen mit Wurzelzuständen über der Quelle a N und Ausgaben mit Wurzelzuständen über dem Ziel β N . Lassen k = | Σ ( a N ) | bezeichnen die Quellraumgröße und l = | Σ ( β N ) | die Zielraumgröße.

Das Entropieverhältnis ist die Differenz zwischen der Quell- und der Zielentropie, die mit bezeichnet wird Δ H A :

Δ H A ( N ) = H A S ( N ) H A T ( N ) = l Ö G 2 ( k l )
Die l Ö G 2 des Verhältnisses der Quellraumgröße zur Zielraumgröße.

Theorem (siehe [1], [5]) (Die ER-Untergrenze): Betrachten Sie einen vergleichsbasierten Algorithmus A mit Quelle a und Ziel β , und mit Eingaben von A von Größe N vorkommend in k Wurzelzustände und Ausgaben, die in auftreten l Wurzelzustände, dh A hat ein Entropieverhältnis Δ H A = l Ö G 2 k l .

Die folgenden unteren Grenzen der Worst-Case- und Average-Case-Vergleichszeit gelten für jeden vergleichsbasierten Algorithmus A dieser Art:

T A W ( N ) Δ H A  Und  T ¯ A ( N ) Δ H A

Untergrenze für vergleichsbasierte Sortieralgorithmen A

Die Untergrenze ist

Δ H A ( N ) = l Ö G 2 ( N ! 1 ) = l Ö G 2 ( N ! )
Das ER ist in diesem Fall die übliche informationstheoretische untere Grenze, dh die Entropie der Eingaben, die eine untere Grenze für die Worst-Case- und Average-Case-Zeit liefert.

Untere Grenze zum Erstellen perfekter Haufen von Größe 7 Betrachten Sie einen vergleichsbasierten Algorithmus H Erstellen perfekter Haufen aus ungeordneten Größenlisten 7 . Es gibt 7 ! 63 perfekte Haufen von Größe 7 . Somit

Δ H H ( 7 ) = l Ö G 2 ( 7 ! 7 ! 63 ) = 63

Das topologische Sortiermodell von [1] ist die nächste Annäherung an eine rein mathematische Problemstellung für vergleichsbasierte Berechnungen. Es vertieft sich nicht in die Syntax (Code) der Algorithmen, sondern identifiziert vergleichsbasierte Algorithmen mit Entscheidungsbäumen, die ihre Berechnungspfade modellieren.

[0] Die Kunst der Computerprogrammierung, Band III, Sortieren und Suchen, D. Knuth, Addison-Wesley, 1998.

[1] Zur Komplexität von Teilauftragsproduktionen Andrew Chi-Chih Yao, SIAM J. COMPUT. Vol. 18, Nr. 4, S. 679-689, Gesellschaft für industrielle und angewandte Mathematik, 1989.

[2] Munro, J. Ian; Suwanda, Hendra; "Implizite Datenstrukturen für schnelles Suchen und Aktualisieren". Zeitschrift für Computer- und Systemwissenschaften . 21 (2): 236–250, 1980.

[3] Schellekens, M.; Ein modularer Kalkül für die durchschnittlichen Kosten der Datenstrukturierung, 2008.

[4] McGeogh, Catherine C.; Ein Leitfaden zur experimentellen Algorithmik, CUP. 2012.

[5] Schonhage, A. (1976), The production of posets, Asterisque 38-39:229-246.

Danke, das war sehr aufschlussreich!
Es scheint, dass sich Ihre Fragen auch darauf beziehen, was auf Hardwareebene passiert. Ich würde das Cambridge Press Book empfehlen: A Guide to Experimental Algorithmics von Catherine c. McGeogh. Dieser Bereich ist ein Mittelweg zwischen rein experimenteller algorithmischer Analyse (zu maschinenabhängig) und theoretischer Analyse (maschinenunabhängig, aber in gewisser Weise zu weit von der Praxis entfernt). Es verwendet Techniken, die einer kontrollierten Laborumgebung in der Informatik ähneln.
@littleO Ich habe die Antwort aktualisiert, um den rein mathematischen Ansatz widerzuspiegeln.
Danke! Ich habe ein neues Kopfgeld gestartet, um diese Antwort zu belohnen.
Danke. Ihre Frage hat mich dazu gebracht, die Definition eines vergleichsbasierten Algorithmus zu formulieren. Hoffe alles ist klar.
@littleO Danke! Schön, dass die Antwort hilfreich war. Ich arbeite an einem Buch über vergleichsbasierte Berechnungen, das das Thema detaillierter darstellen wird.

Vergleichssortierungen werden oft ohne Bezugnahme auf Algorithmen definiert.

Definition: Ein Vergleich sortiert weiter N elements ist ein verwurzelter binärer Baum, in dem

  • jeder Knoten v ist mit einer Reihe von Permutationen gekennzeichnet P ( v ) S N ,
  • jeder interne Knoten v ist mit einem Paar unterschiedlicher Indizes gekennzeichnet 1 ich v < J v N ,
  • für den Wurzelknoten v , wir haben P ( v ) = S N ,
  • für jeden Blattknoten v , wir haben | P ( v ) | 1 ,
  • für jeden internen Knoten v , seine linken und rechten Kinder v < Und v > erfüllen
    P ( v < ) = { σ P ( v ) σ ich v < σ J v } , P ( v > ) = { σ P ( v ) σ ich v > σ J v } .

Hier ist zum Beispiel eine Vergleichssortierung für 3 Elemente:

Beispiel

(Sie können – müssen aber nicht – sich eine Vergleichssortierung als den Entscheidungsbaum eines Algorithmus vorstellen, bei dem bei jedem Schritt P ( v ) stellt die Menge möglicher Ordnungen dar; der Algorithmus wählt Indizes aus ich v Und J v und vergleicht die Elemente an diesen Indizes, um die Menge der Möglichkeiten einzugrenzen.)

Theorem: Die Höhe eines beliebigen Vergleichs sortiert weiter N Elemente ist Ω ( N lg N ) .

Beweis: Ein binärer Höhenbaum H hat höchstens 2 H Blätter, aber eine Vergleichssortierung hat zumindest N ! , So H lg N ! = Ω ( N lg N ) . ∎

Ich habe auch damit zu kämpfen, jetzt, wo ich einige Kurse in theoretischer reiner Mathematik belege ... Ich habe versucht, den Algorithmus neu zu definieren oder zu versuchen, eine "statische" Definition von Algorithmus zu erhalten, und nicht versucht, ein "Verb" wie Vergleichen zu verwenden , Bewegung usw. Knuths Definition geht davon aus, dass es mindestens ein Turing-Maschinenmodell oder Von Neumann gibt. Für Mathematiker muss es kein Maschinenmodell für die theoretische Analyse geben. Hier ist etwas, von dem ich denke, dass es der Denkweise eines Mathematikers näher kommt ... Auf keinen Fall streng ... aber ich zeige einen Ansatz.

Defn: Lassen Sie einen Satz A = { A ich } 0 ich N . Lassen σ : A A eine 'aufsteigend sortierte' Karte sein, so dass σ ( A ich ) = A k mit folgender Einschränkung

  1. Wenn ich < J Dann σ ( A ich ) σ ( A J ) (aufsteigende Karte)
  2. Seien 'Algorithm Maps' eine Familie von Funktionen F T : { [ 0 , 1 ] , σ } { A , B T { A k + 1 } , B 1 } Wo B T = { A k } k N A so dass ... (1) gilt B T Und σ ( A ich ) = A ich iff ich > k . F ( 0 , σ ) = A , F ( 1 , σ ) = B 1 Und k = N . Zum Zeitpunkt T F ( T , σ ) = B T { A k + 1 } und es gibt so etwas k Und B T .

Die schnellste Algorithmuskarte ist F T Wo T ist minimal. Dies ist unabhängig vom Modell wie Turing oder RAM usw. Dies ist ähnlich wie Definitionen von "Deformationsrückzug" aus der algebraischen Topologie für zB

Abgesehen davon würde ich sagen, dass es in der Mathematik immer noch einige 'Verben' gibt, wie 'Rotation' oder die Gruppenoperation, die zB die physikalische Welt unabsichtlich einbringt. IMHO sollten sie so gering wie möglich sein