Beispielprobleme mit Polynom- und Exponentiallösungen und kleinem Platzbedarf?


8

Ich plane, in diesem Herbst ein „Experiment“ durchzuführen, wenn ich meine Algorithmusklasse unterrichte, mit einem sehr alten, begrenzten Computer (Hauptbeschränkungsfaktor ist wahrscheinlich Speicher - möglicherweise nur 16 KB) und einem modernen / Standard-Computer. Die Idee war, ein Problem mit einem Polynom zu lösen, das auf dem langsamen Computer läuft, und einem exponentiellen auf dem schnellen Computer (und natürlich den langsamen zu gewinnen).

Das Problem besteht darin, ein geeignetes Problem zu finden - eines, bei dem die Laufzeiten für Fälle mit sehr begrenzter Größe sehr unterschiedlich sind (und bei denen die Datenstrukturen vorzugsweise recht einfach sind; der primitive Computer ist… primitiv). Ich habe ursprünglich über Sortieralgorithmen nachgedacht (z. B. quadratisch oder linear), aber das würde viel zu große Instanzen erfordern (es sei denn, ich habe mich zum Beispiel für Bogosort entschieden).

Im Moment ist das einzige (ziemlich langweilige) Beispiel, an das ich gedacht habe, die Berechnung von Fibonacci-Zahlen auf intelligente und dumme Weise. Es wäre schön, wenn etwas weniger müde / überbeansprucht wäre und vorzugsweise etwas (halb-) offensichtlich Nützliches. Irgendwelche Ideen / Vorschläge?


Eigentlich plante ich, das Pseudopolynom („linear im Fibonacci-Rang“) und überexponentielle (rekursive) Lösungen für das Problem zu verwenden. Der Hauptpunkt ist der offensichtliche Unterschied in der Komplexität, wodurch der schwächere Computer leicht gewinnen kann.
Magnus Lie Hetland

1
Bipartite Maximum-Weight-Matching (Ungarisch vs. Brute-Force)?
Jukka Suomela

Antworten:


6

Eine Antwort, die Neels Kommentar etwas verallgemeinert, ist ein Blick in den Bereich der Suche und der dynamischen Programmierung, der voll von wunderbaren Algorithmen ist, die eine großartige Leistung erbringen, wenn Sie sich merken, und schrecklich, wenn Sie dies nicht tun - selbst die langweilige Fakultätsfunktion, an die Sie gedacht haben, fällt in diese Kategorie.

Natürlich werden Sie durch die Speicherobergrenze des langsamen Computers eingeschränkt sein, aber ich denke, das bedeutet nur, dass Sie vorsichtig sein müssen, dass Sie für den schnellen Computer ausreichend "gemein" sind. Hier sind einige spezifische Ideen:

  • Suchen Sie bei einem großen ungerichteten Diagramm einen Pfad zwischen zwei Punkten. Der schnelle Computer implementiert eine (faire oder möglicherweise nicht endende!) Zufällige Suche durch das Diagramm, während der langsame Computer ruhig eine Breitensuche oder eine Tiefensuche durchführt. Sie müssten dies wahrscheinlich in mehreren Versuchen ausführen, um sicherzustellen, dass der Leistungsunterschied spürbar ist.
  • Holen Sie sich ein gerichtetes Diagramm und versuchen Sie, den kürzesten Pfad zwischen zwei Punkten zu finden: Der schnelle Computer zählt zuerst alle azyklischen Pfade auf (unter Verwendung des Algorithmus zur Erkennung des Schildkröten- und Hasenzyklus bei jedem Schritt, bwahahahaha), und der langsame Computer führt geduldig die kürzeste aus einer Hand aus Pfad.
  • Der Algorithmus zum Bearbeiten der Entfernung? Jeder eher naive als dynamische Programmieralgorithmus wird hier wahrscheinlich vollständig ersticken.

Eine letzte Idee ist, dass Sie einige Algorithmen in Prolog mit und ohne (unnötige) Vorkommensprüfung ausprobieren können. Aber wenn Sie diesen Schülern zeigen, wie wunderbar es ist, dass Prolog ohne semantisch bedeutsame Vorkommnisse schneller ist, werde ich weinen. Dies ist normalerweise auch ein lineares gegen ein quadratisches, kein Polynom gegen ein Exponential.


9

Sie können reguläre Ausdrücke abgleichen. Ein naiver Backtracking-Matcher kann bei Eingaben, die ein intelligenterer Matcher in linearer Zeit verarbeiten kann, leicht in ein exponentielles Verhalten versetzt werden.


5

Versuchen Sie, perfekte Übereinstimmungen in planaren Graphen zu zählen, ein Problem, das leicht zu erklären sein sollte. Im planaren Fall löst der Fisher-Kastelyen-Temperley-Algorithmus es in Polynomzeit, während für allgemeine Graphen das Problem # P-vollständig ist, dh wahrscheinlich kein schnellerer Weg als das Brute-Force-Zählen. Führen Sie einfach FKT auf der langsamen Maschine aus und zählen Sie mit brutaler Gewalt auf die schnelle.

( Dies ist auch eine verwandte Frage.)


1

Wenn Sie Algorithmen unterrichten, sollten Sie meiner Meinung nach etwas Einfaches tun, das die Idee veranschaulicht. Ich denke, dass Ihre Idee mit dem Sortieralgorithmus sehr gut ist und wahrscheinlich funktioniert, wenn Sie nichtrekursive Algorithmen im primitiven Computer ausprobieren.

Ich vergleiche derzeit Sortieralgorithmen und habe Heap Sort mit 17.000 Elementen auf einem Computer mit 32 KB RAM ausgeführt.

Ich würde versuchen, Einfügungssortierung gegen Heap-Sortierung.


Das Einfügen von 17000 Elementen auf einem modernen Computer ist jedoch ziemlich schnell. (Die Frage spielt bereits darauf an.)
Radu GRIGore
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.