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?
quelle
Antworten:
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:
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.
quelle
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.
quelle
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.)
quelle
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.
quelle