Pathologische Sortierung
Ihr Chef hat verlangt, dass Sie einen Sortieralgorithmus entwickeln, um die Leistung Ihrer Unternehmensanwendung zu verbessern. Nachdem Sie den Antrag geschrieben haben, wissen Sie, dass Sie ihn wahrscheinlich nicht wesentlich schneller machen können. Um Ihren Chef nicht zu enttäuschen, haben Sie sich entschlossen, einen neuen Algorithmus zu entwickeln, der noch besser funktioniert als das Sortieren bestimmter Datensätze. Natürlich können Sie nicht klar machen, dass der Algorithmus nur in einigen Fällen funktioniert, und Sie möchten ihn so dunkel wie möglich gestalten.
Ziel dieses Wettbewerbs ist es, eine Sortierroutine in der Sprache Ihrer Wahl zu schreiben, die bei bestimmten Datensätzen eine bessere Leistung als bei anderen erzielt und wiederholbare Ergebnisse liefert. Je genauer die Klassifizierung ist, die die Geschwindigkeit bestimmt, desto besser. Der Algorithmus muss in irgendeiner Weise sortieren, sodass ein Algorithmus, der davon abhängt, dass die Daten bereits vollständig sortiert sind (wie bei einem Algorithmus, der nichts tut), oder ein Algorithmus, der davon abhängt, dass die Daten vollständig in umgekehrter Reihenfolge sortiert sind, beide ungültig sind. Der Sortieralgorithmus muss alle Datensätze korrekt sortieren.
Geben Sie nach der Vorstellung Ihrer Routine eine Erklärung an, warum dies nur für bestimmte Datensätze funktioniert, und führen Sie Testläufe für mindestens einen Satz guter (schneller) und einen Satz schlechter (langsamer) Daten durch. Hier geht es darum, Ihrem Chef zu beweisen, dass Sie auf eine bessere Sortiermethode gestoßen sind, sodass mehr Testdaten besser sind. Natürlich zeigen Sie Ihrem Chef nur die Testergebnisse aus den guten Daten, sodass der Fehler in den erforderlichen Testdaten nicht zu offensichtlich sein kann. Falls für Ihre Sprache zutreffend, zeigen Sie bitte, dass Ihr Algorithmus schneller ist als der in Ihrer Sprache integrierte Sortieralgorithmus.
Beispielsweise könnte man einen Einfügungssortierungsalgorithmus einreichen, wobei die guten Daten Daten sind, die bereits nahezu sortiert sind, und die schlechten Daten vollständig zufällige Daten sind, da die Einfügungssortierung bei nahezu sortierten Daten gegen O (n) geht. Dies ist jedoch nicht sehr gut, da mein Chef wahrscheinlich bemerken würde, dass alle Testdaten von Anfang an fast sortiert sind.
Dies ist ein Beliebtheitswettbewerb , daher gewinnt die Antwort mit den meisten Stimmen nach 7 Tagen (21. Mai).
Wenn mich niemand schlägt, möchte ich eine Community-Wiki-Antwort einreichen, die gleichmäßig verteilte Datensätze nutzt.
quelle
Antworten:
Es ist eine ziemlich lange Zeit her, aber ich erinnere mich, dass wir in Algorithmus 101 einen Sortieralgorithmus gelernt haben, der Zufallsgenerierung verwendete. Ich war kein sehr guter Schüler und kann mich nicht wirklich erinnern, wie es gelaufen ist oder warum es im Durchschnitt schnell funktioniert hat.
Trotzdem habe ich beschlossen, dass dieses Problem eine Lösung erfordert, die Randomisierung verwendet, was hoffentlich im Durchschnitt zu meinen Gunsten funktioniert.
Da echte Randomisierung wichtig ist, stelle ich sicher, dass der RNG die Antwort auf das Leben, das Universum und alles enthält. Nach einigem Testen stellte sich heraus, dass dies ein kluger Schachzug war! Überprüfen Sie, wie schnell diese 2 völlig willkürlichen Listen sortiert werden:
Beides wird in nur 1 Iteration sortiert - eine schnellere Funktion kann man sich nicht wünschen!
Zugegeben, einige andere Listen führen zu etwas schlechteren Ergebnissen ...
Diese werden in 4.176 bzw. 94.523 Iterationen sortiert, was tatsächlich mehr als eine Sekunde dauert ... aber lassen Sie uns diese Tatsache einfach für uns behalten, um niemanden davon abzulenken, wie erstaunlich dieser Algorithmus ist!
Bearbeiten:
Ich wurde gebeten, die Effizienz meines Algorithmus auf einer Liste mit 100 Elementen zu beweisen.
Auch diese lange und völlig willkürliche Liste wird sofort sortiert! Wahrlich, ich muss über den besten Sortieralgorithmus der Welt gestolpert sein!
quelle
Wenn Sie Ihre eigenen Daten erstellen können, ist dies recht einfach: Sie erhalten Daten, die zufällig aussehen, aber einen Schlüssel für eine schnellere Sortierung enthalten. Alle anderen Daten verwenden die ursprüngliche Sortiermethode, sodass die Durchschnittszeiten besser sind.
Eine einfache Möglichkeit besteht darin, sicherzustellen, dass jedes Datenelement einen eindeutigen Schlüssel hat, und dann nur die Schlüssel zu hashen. Nehmen Sie zum Beispiel eine Liste mit den Zahlen von 1-10.000, alle multipliziert mit 16, und mit einer Zufallszahl von 0-15 (siehe fillArray () unten). Sie sehen zufällig aus, aber jeder hat einen eindeutigen sequenziellen Schlüssel. Teilen Sie zum Sortieren durch 16 (in C ist die >> 4 sehr schnell) und platzieren Sie dann die Zahl in einem Array, wobei Sie den resultierenden Schlüssel als Index verwenden. Ein Pass und du bist fertig. Beim Testen stellte ich fest, dass Quicksort bei zehn Millionen Nummern 30-mal langsamer war.
Alles, was einen eindeutigen Schlüssel hat, kann auf diese Weise sortiert werden - wenn Sie den Speicher zum Speichern haben, natürlich. Zum Beispiel verwenden viele Datenbanken eine eindeutige numerische Kunden-ID. Wenn die Liste klein oder sequenziell genug ist, kann sie im Speicher gespeichert werden. Oder eine andere Möglichkeit, einen Datensatz in eine eindeutige Nummer zu übersetzen. Weitere Informationen finden Sie unter Hash Sorts.
quelle