Frage

Von Zeit zu Zeit zu sehen ich das Netz und suche nach interessanten Algorithmen und Datenstrukturen in meine Tasche von Tricks zu setzen. Vor einem Jahr kam ich über die Soft-Heap Datenstruktur und lernte in der Nähe von Sortieranlage.

Die Idee dahinter ist, dass es möglich ist, die O (n log n) Barriere vergleichen basiert Sorten zu brechen, wenn Sie mit der Tatsache leben, dass der Sortieralgorithmus ein bisschen betrügt. Sie erhalten eine fast sortierte Liste, aber Sie haben auch mit einigen Fehlern zu leben.

Ich spielte mit den Algorithmen in einem Test environement um, aber nie eine Verwendung für sie gefunden.

So ist die Frage: Hat jemand schon einmal in der Nähe von Sortieranlagen in der Praxis? Wenn ja, in welcher Art von Anwendungen? Können Sie einen Anwendungsfall, wo in der Nähe von Sortierung ist das Richtige zu tun ausdenken?

War es hilfreich?

Lösung

Es gibt eine Menge von „gierigen“ Heuristik, wo Sie in regelmäßigen Abständen die mindestens einen Satz auswählen. Die gierige Heuristik ist nicht perfekt, so dass selbst wenn Sie die minimale holen Sie sind nicht auf die beste endgültige Antwort erhalten garantiert. In der Tat, noreferrer"> die

Andere Tipps

Dies ist eine Gesamtflug Vermutung, aber die inhärente Subjektivität der „Relevanz“ Maßnahmen gegeben, wenn die Suchergebnisse sortieren, ich würde wagen, dass es nicht wirklich wichtig, ob sie perfekt sortiert ist. Das gleiche könnte für Empfehlungen gesagt werden. Wenn Sie irgendwie arrangieren, dass jeder andere Teil Ihres Algorithmus für diese Dinge ist O (n), dann könnte man sich auf eine Art zu vermeiden.

Beachten Sie auch, dass im schlimmsten Fall Ihre „fast sortiert“ data nicht erfüllen eine mögliche intuitive Idee der „fast sortiert“, das ist, dass es nur eine geringe Anzahl von Inversionen hat. Der Grund dafür ist nur, dass, wenn Ihre Daten nur O (n) Inversionen hat, dann kann man es in O (n) Zeit mit Insertionsort oder Shakersort (das heißt Zweiweg-Bubble-Sort) beenden zu sortieren. Daraus folgt, dass Sie kann unmöglich diesen Punkt aus völlig unsortiert erreicht hat, in O (n) Zeit (unter Verwendung von Vergleichen). So Sie suchen Anwendungen, bei denen eine Mehrheit Teilmenge der Daten sortiert werden und der Rest verstreut, nicht für Anwendungen, dass jedes Element in seine richtige Position in der Nähe ist.

Sie hier spekulieren, aber eine Sache, die ich vorstellen, ist Datenbank-Abfrage-Optimierung.

Eine Datenbankabfrage in einer deklarativen Sprache wie SQL hat in einer Schritt-für-Schritt-Programm ein „Ausführungsplan“ genannt übersetzt werden. Eine SQL-Abfrage kann in der Regel auf eine Anzahl solcher Ausführungspläne übersetzt werden, die alle das gleiche Ergebnis geben können, aber sehr unterschiedliche Leistung. Der Abfrageoptimierer hat die schnellsten oder zumindest eine, die relativ schnell ist.

Kostenbasierte Abfrage-Optimierer haben eine „Kostenfunktion“, die sie die Ausführungszeit eines bestimmten Plan zu schätzen verwenden. Erschöpfende Optimizern gehen durch alle möglichen Pläne (für einen Wert von „alle möglichen“) und wählen Sie die schnellste. Für komplexere Abfragen die Anzahl der möglichen Pläne können untragbar groß sein, um übermäßig lange Optimierungszeiten führen (bevor Sie sogar die Suche in der Datenbank beginnen!), So gibt es auch nicht erschöpfende Optimizern. Sie sehen nur auf einige der Pläne, vielleicht mit einem Zufallselement bei der Auswahl welche. Dies funktioniert, da es in der Regel eine große Anzahl von „guten“ Pläne, und es ist vielleicht nicht so wichtig sein, die absolut besten zu finden - es ist wahrscheinlich besser, einen 5-Sekunden-Plan anstelle des optimalen 2-Sekunden-Plan zu wählen wenn es mehrere Minuten der Optimierung zu finden, um die 2-Sekunden-Plan.

erfordert

Einige Optimierungsalgorithmen verwenden eine sortierte Warteschlange von „vielversprechend“ (teilweise) Pläne. Wenn es nicht wirklich wichtig, wenn Sie den absolut besten Plan finden, vielleicht könnten Sie eine fast sortierte Warteschlange verwenden?

Eine weitere Idee (und ich spekuliere gerade noch) ist ein Planer für Prozesse oder Threads in einem Time-Sharing-System, in dem es nicht wichtig sein könnte, wenn ein bestimmte Prozess oder Thread seine Zeitschlitz später ein paar Millisekunden bekommt, als wenn streng sortiert nach Priorität.

Eine häufige Anwendung für nahezu Sortierung ist, wenn ein Mensch den paarweisen Vergleich tut, und Sie wollen, dass sie so viele Fragen nicht fragen müssen.

Sagen Sie viele Produkte haben Sie einen Menschen über paarweise Vergleich sortieren möchten. Sie können stark die Anzahl der Vergleiche reduzieren Sie sie tun müssen, wenn Sie bereit sind, dass eine Bestellung zu akzeptieren, nicht genau sein. Sie könnten zum Beispiel nicht, wenn benachbarte Elemente ein, solange die bevorzugten Elemente sind an der Spitze ausgetauscht werden.

überall

  1. Sie sollen schnell reagieren,
  2. Sie sind viel versprechende nicht genaues Verhalten an den Client,
  3. aber intern einige Regeln

Sie können es verwenden. Wie wäre es „nicht so streng“ regelbasierte Prioritäts-Warteschlange? Wo wäre das sinnvoll sein? Vielleicht Thread / Prozess / Ressource-Scheduling. Im Thread / Prozess-Scheduling sind Sie wirklich nicht viel versprechend ein Faden ersten, zweiten gehen wird, oder die letzten, aber in der Regel wollen Sie jeden eine Chance zu geben. Vielleicht möchten Sie lose Regel erzwingen, so dass es preemptive ist, priorisiert, blabla ..

Ein Ressourcenplan Beispiel Pizzabote oder Versandkartons von Büchern zu Menschen usw. wird reagieren würden Sie es nicht in den deterministischen Ergebnis wird erwartet, verwenden können, aber es gibt viele Beispiel im wirklichen Leben, wo die Dinge sind nicht so deterministisch / vorhersagbar.

O (n log n) ist schon ziemlich schnell. Ich glaube nicht, dass jemand würde jemals beginnen einen nahezu Sortieralgorithmus. Sie würden mit dem Code beginnen, der gerade eine komplette Art tut (da Programmiersprache der Wahl wahrscheinlich eine sort Funktion bieten und keine nearsort-Funktion), und wenn man empirisch festgestellt, dass die Art zu lang nahm, würden Sie zu fragen beginnen, ob Ihre Daten wirklich muss vollständig geordnet sein, und betrachten eine nahezu Art verwendet wird.

Im Grunde würden Sie nie in Betracht, auch eine in der Nähe von Art verwenden, wenn Sie erste Sortieranlage entdecken ein schwerer Engpass in Ihrem Programm zu sein.

scroll top