Eine Zustandsmaschine nimmt Eingaben entgegen, die ihren Zustand in einen endlichen Satz anderer Zustände umwandeln können oder nicht. Wie unterscheidet sich das von jedem anderen Computerprogramm?
Einige Antworten hier betonen, dass in unserem (wahrscheinlich) endlichen Universum alles endlich ist, alle Computerprogramme in endlicher Zeit ausgeführt werden, daher ist technisch alles eine endliche Zustandsmaschine. Das ist "technisch korrekt (die beste Art von richtig)", aber es fehlt auch völlig der Punkt.
Das Wesentliche ist Folgendes: - Einige Computerprogramme benötigen mehr Arbeitsspeicher, wenn sie größere und komplexere Eingaben erhalten. Einige tun es nicht.
Wenn Sie dies erkennen, erhalten Sie einen theoretisch-informatischen Einblick, der es Ihnen ermöglicht, effizientere und elegantere Programme zu schreiben, wenn Sie auf ein bestimmtes Problem stoßen. Außerdem können Sie die Art des Problems erkennen, bei dem dies auftreten kann.
Hier sind zwei Spielzeugbeispiele:
Problem 1: Ein Programm empfängt eine Liste von Zeichen bei Standardeingabe. Nachdem alle Zeichen verarbeitet wurden, muss das Programm drucken, ob die Anzahl der "x" -Zeichen in der Eingabe ungerade oder gerade war .
Problem 2: Ein Programm empfängt eine Liste von Zeichen bei der Standardeingabe. Nachdem alle Zeichen verarbeitet wurden, muss das Programm drucken, ob die Anzahl der "x" -Zeichen in der Eingabe kleiner , gleich oder größer als die Anzahl der "y" -Zeichen war.
Möglicherweise möchten Sie jetzt aufhören zu lesen, die Probleme in Ihrer bevorzugten Programmiersprache (oder nur einem Pseudocode) lösen und später zurückkehren.
...
Das Wichtige, was Sie vielleicht bemerkt haben, ist Folgendes: Um die Lösung für Problem 1 richtig zu implementieren, benötigen Sie nur ein Bit Speicher. Sie müssen nicht berechnen, wie viele "x" Sie bereits verarbeitet haben - nur, ob die Anzahl der bisher verarbeiteten "x" ungerade oder gerade war. Wenn Sie auf ein anderes "x" stoßen, drehen Sie das Bit um. Schauen Sie sich am Ende des Programms das Bit an und drucken Sie die Antwort aus.
Enthält Ihre Eingabe ein Dutzend Zeichen? Tausende von Charakteren? Googolplex-Charaktere (natürlich hypothetisch)? Macht nichts; Ein bisschen Arbeitsspeicher reicht noch aus.
Mit Problem 2 können Sie nicht dasselbe tun. Beim Lesen der Zeichen müssen Sie sich an den Unterschied zwischen der Anzahl der bereits verarbeiteten "x" und "y" erinnern. Andernfalls können Sie die richtige Antwort nicht zuverlässig drucken. Sie können erkennen , dass Sie tatsächlich nicht daran zu erinnern , müssen beide die Zahlen von „x“ ‚s und‚y‘‘ s - nur ihre Differenz, so weit; Ein ganzzahliger Wert, den Sie erhöhen, wenn Sie auf ein anderes "x" stoßen, und verringern, wenn Sie auf ein anderes "y" stoßen. Wenn Sie sich jedoch dazu entschließen, z. B. 32 Bit Speicher zu verwenden, um diesen Wert beizubehalten, erhalten Sie möglicherweise eine Eingabe ( mehrere Milliarden Zeichen lang), die Sie mit der angegebenen begrenzten Speichermenge nicht richtig verarbeiten können.
Dies ist es, was wir damit meinen, dass das Problem 1 von einer "Zustandsmaschine" gelöst werden kann und das Problem 2 nicht. Eine begrenzte Speichermenge reicht für eine Eingabe beliebiger Größe.
(Natürlich könnten Sie auch eine ineffiziente Lösung für das Problem 1 schreiben, bei der Sie versuchen würden, alle "x" zu zählen, und dann könnten Sie auch ein Problem mit zu wenig Speicher bekommen. Aber der Unterschied ist, dass ein effiziente Lösung für das Problem 1 besteht , während eine ähnlich effiziente Lösung für das Problem 2 funktioniert nicht .)
Warum ist das im wirklichen Leben wichtig?
Erstens liegt das Dilemma im Gegensatz zu diesen beiden Spielzeugbeispielen möglicherweise nicht zwischen buchstäblich einem Bit und einem ganzzahligen Wert, sondern zwischen einer großen und einer noch größeren Datenstruktur. Manchmal passt die "noch größere" Datenstruktur nicht in den Computerspeicher oder verlangsamt das Programm ausreichend, selbst für realistische Eingaben.
Zweitens wird die Lösung mit der Zustandsmaschine wahrscheinlich viel schneller sein. Außerdem wird es linear mit der Länge der Eingabe skaliert . Das heißt, die Verarbeitung einer 10-mal längeren Eingabe erfordert 10-mal mehr Zeit (im Gegensatz zu beispielsweise 100-mal mehr Zeit). Dies ist eine gewünschte Eigenschaft, wenn Sie viele Daten verarbeiten müssen.
Drittens wirkt sich eine begrenzte oder unbegrenzte Speichernutzung auf die Sicherheit aus . Wenn Sie ein Programm schreiben, das nur begrenzten Speicher benötigt, müssen Sie sich keine Gedanken über Speicherüberläufe machen und darüber, wie diese möglicherweise missbraucht werden können, um die Sicherheit des gesamten Systems zu gefährden.
Viertens ist dies Teil eines Standardlehrplans für Informatik in jeder anständigen Schule: formale Sprachen , Authome , Komplexität der Berechnungen usw. Um das Gesamtbild hinter dem Computerdesign zu verstehen, im Gegensatz zu "ähm, ich habe einige Codeteile aus dem Internet zusammengestellt, hoffe ich wirklich, dass es funktioniert, aber ich kann es nicht sicher sagen".
Um diese Theorie zu nutzen, brauchen Sie keine spezielle Maschine, kein Framework oder keine Bibliothek ... Sie müssen nur erkennen, "oh, dieser Teil des Problems kann tatsächlich mit einer begrenzten Menge an Speicher gelöst werden" und schreiben Ihr Programm (in Ihrer bevorzugten Programmiersprache) entsprechend. In einigen Situationen ist es jedoch besser, eine vorhandene Bibliothek zu verwenden, damit Sie das Rad nicht neu erfinden müssen.