2013-05-10 7 views
16

In JavaScript (etwas anderswo anwendbar), wo Sie nicht wissen, welche Zielimplementierung Ihr Code läuft, gibt es eine Möglichkeit zu erkennen, ob der zugrundeliegende Sortieralgorithmus (von Array.sort) stabil ist oder nicht, nur zu wissen folgt the specification?Gibt es eine Black-Box-Methode, um festzustellen, ob ein Sortieralgorithmus stabil ist?

Ich könnte 2 Tests in Webkit (1)(2) finden, aber wie zuverlässig sind diese Tests? (Könnte diese Überprüfung mit einer PCP durchgeführt werden?) Ich bin auf der Suche nach einer Lösung, die mathematisch solide wäre.

Dies ist ein kniffliges Problem, da ein fortgeschrittener Sortieralgorithmus Subalgorithmen abhängig von der Länge des Quell-Arrays (wie Timsort) ändern kann. Ich war verwirrt, da jeder Test, den ich ausgeführt habe, gezeigt hat, dass Google Chrome stabil ist, aber die gesamte Dokumentation, die ich gesehen habe, hat gesagt, dass sie instabil ist (the source wird dir sagen warum).

(In der Regel verwenden, ich this strategy meiner Art stabil zu machen, es hat eine kleine, aber manchmal noticable Auswirkungen auf die Leistung)

Quellcode für die Sortierung in verschiedenen Implementierungen:
+0

Sie können eine solche Bestimmung nur probabilistisch machen: Ich kann zum Beispiel einen Sortieralgorithmus 'S' definieren, der den Eingang' I' benutzt. Normalerweise "S" faßt die eigentliche Sortierarbeit zu einem stabilen Sortieralgorithmus "T" aus, aber wenn "I" gleich einem speziellen Wert "I" ist, verwendet es stattdessen eine nicht stabile Sortierfolge "U".Du wirst nie beweisen, dass "S" nicht stabil ist, außer du hast Glück und passierst "I" als Eingabe. Realistischerweise verwendet "S" wahrscheinlich stabile Sortierungen, es sei denn, "I" ist sehr lang. Auch hier werden Sie nur instabile Sortierungen beobachten, wenn Sie an entsprechend langen Eingaben testen. – apsillers

+2

Wenn die Spezifikation besagt, dass sie nicht stabil ist, bedeutet dies nicht, dass Sie beim Sortieren des Arrays erwarten können, dass die Elemente die Reihenfolge wechseln, sondern dass Sie sich nicht darauf verlassen können. es gibt keine Versprechungen. Dass die (aktuelle) Implementierung stabil ist, bedeutet nicht, dass es immer sein wird, oder für alle Plattformen, auf denen Chrome läuft. – frozenkoi

+0

Ich stimme @MarZab zu, dass dies ein Problem mit dem Anhalten ist. Sie könnten etwas mehr Aufmerksamkeit sehen, wenn Sie es "[Informatik]" und/oder "[Informatik-Theorie]" markieren. – apsillers

Antwort

0

Führen Sie einen kleinen internen Test, um zu überprüfen? Sie können das Beispiel "Spielkarten nach Rang, dann nach Farbe" aus Wikipedia verwenden, um nach Stabilität zu suchen.

Siehe: https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

Ich weiß nicht, wie viele Karten, die Sie brauchen Stabilität zu überprüfen - vielleicht 5 oder so?

1

Mathematisch klingen, was? Das würde erfordern, dass sich jeder Pfad im Algorithmus als stabil erweist - und jede Kombination davon. Für alle möglichen Daten.

Sicher Algorithmen wie diese existieren - aber sie wurden höchstwahrscheinlich gemacht, um diese Anforderung zu erfüllen. Wenn es so ist, sagt es wahrscheinlich, dass es irgendwo ist.

Wie für einen Test, um etwas wie das zu beweisen, fällt das wahrscheinlich unter ähnliche Probleme wie ein Halting-Problem.

http://en.wikipedia.org/wiki/Halting_problem

+0

Nicht sicher, ob das Halting-Problem aufgerufen werden muss, aber es sollte klar sein, dass eine Superexponential-Suche notwendig ist, um * alle * Möglichkeiten für eine gegebene Eingabegröße zu erfassen –

5

Black-Box-Tests können nicht verwendet werden, um festzustellen, dass ein Programm jedes Kriterium erfüllt, wenn Sie alle möglichen Eingaben relevant für das Kriterium testen. Eine Blackbox kann einfach eine Lookup-Tabelle haben, die Inputs auf Outputs abbildet (siehe Pentium FDIV bug für einen echten Nachschlagetabellen-Bug), so dass Sie nicht sicher sein können, dass Ihre Tests die Möglichkeit ausschließen, dass ein anderer Input einen Verstoß auslöst.

1

Warum riskieren Sie es? Für die meisten sinnvollen Datensätze sollte eine JavaScript-Implementierung von merge sort schnell genug sein. Nehmen Sie ein Paar auf und benchmarken Sie es und verwenden Sie das Beste.

Verwandte Themen