Deterministischer Algorithmus

Im Informatik, a deterministischer Algorithmus ist ein Algorithmus Dies erzeugt bei einem bestimmten Eingang immer die gleiche Ausgabe, wobei die zugrunde liegende Maschine immer durch die gleiche Reihenfolge von Zuständen verläuft. Deterministische Algorithmen sind bei weitem die am meisten untersuchte und vertraute Art von Algorithmus sowie eine der praktischsten, da sie effizient auf realen Maschinen betrieben werden können.

Formal berechnet ein deterministischer Algorithmus a Mathematische Funktion; Eine Funktion hat einen eindeutigen Wert für jede Eingabe in ihrer Domainund der Algorithmus ist ein Prozess, der diesen besonderen Wert als Ausgabe erzeugt.

Formale Definition

Deterministische Algorithmen können in Bezug auf a definiert werden Zustandsmaschine: a Zustand beschreibt, was eine Maschine zu einem bestimmten Zeitpunkt in der Zeit tut. Staatliche Maschinen gehen diskret von einem Zustand zum anderen. Kurz nachdem wir die Eingabe eingegeben haben, befindet sich die Maschine in ihrer Ausgangszustand oder Staat starten. Wenn die Maschine deterministisch ist, bedeutet dies, dass ihr aktueller Zustand ab diesem Zeitpunkt feststellt, wie ihr nächster Zustand aussehen wird. Sein Kurs durch die Zustände ist vorbestimmt. Beachten Sie, dass eine Maschine deterministisch sein kann und trotzdem nie stoppt oder beendet hat und daher kein Ergebnis liefert.

Beispiele für bestimmte Abstrakte Maschinen die deterministisch sind deterministische Turing -Maschine und Deterministische endliche Automaten.

Nichtdeterministische Algorithmen

Eine Vielzahl von Faktoren kann dazu führen, dass sich ein Algorithmus auf eine Weise verhalten, die nicht deterministisch oder nicht deterministisch ist:

  • Wenn es einen anderen externen Zustand als die Eingabe verwendet, wie z. B. Benutzereingabe, a Globale Variable, ein Hardware -Timer -Wert, a zufällig Wert oder gespeicherte Festplattendaten.
  • Wenn es auf eine Weise funktioniert, die zeitlich sensitiv ist, wenn es beispielsweise mehrere Prozessoren gleichzeitig auf dieselben Daten schreiben. In diesem Fall wirkt sich die genaue Reihenfolge, in der jeder Prozessor seine Daten schreibt, das Ergebnis aus.
  • Wenn ein Hardwarefehler dazu führt, dass sich der Status auf unerwartete Weise ändert.

Obwohl echte Programme selten nur deterministisch sind, ist es für Menschen und andere Programme einfacher, für Programme zu begründen. Aus diesem Grund die meisten Programmiersprachen und speziell Funktionelle Programmierung Sprachen bemühen sich, zu verhindern, dass die oben genannten Ereignisse auftreten, außer unter kontrollierten Bedingungen.

Die Prävalenz von Multi-Core-Prozessoren hat zu einem Anstieg des Interesses am Determinismus bei paralleler Programmierung geführt und die Herausforderungen des Nichtdeterminismus gut dokumentiert.[1][2] Eine Reihe von Tools, die mit den Herausforderungen umgehen, wurden vorgeschlagen[3][4][5][6] damit umgehen Deadlocks und Rennbedingungen.

Nachteile des Determinismus

In einigen Fällen ist es vorteilhaft, dass ein Programm nicht deterministisches Verhalten aufweist. Das Verhalten eines Kartenschlufprogramms, das in einem Spiel von verwendet wird BlackjackZum Beispiel sollte beispielsweise von Spielern nicht vorhersehbar sein - auch wenn der Quellcode des Programms sichtbar ist. Die Verwendung von a Pseudorandom -Zahlengenerator reicht oft nicht aus, um sicherzustellen, dass die Spieler das Ergebnis eines Shuffle nicht vorhersagen können. Ein cleverer Spieler könnte genau die Zahlen erraten, die der Generator auswählt, und bestimmen daher den gesamten Inhalt des Decks im Voraus, wodurch er schummeln kann. Beispielsweise konnte die Software Security Group von zuverlässigen Softwaretechnologien dies für eine Implementierung von Texas Hold 'EM Poker tun, die von ASF Software, Inc verteilt wird, um das Ergebnis des Hände konsequent vorherzusagen.[7] Diese Probleme können teilweise durch die Verwendung von a vermieden werden Kryptografisch sichern Pseudo-Random-Zahlengenerator, aber es ist immer noch notwendig für eine unvorhersehbare zufälliger Samen zum Initialisieren des Generators verwendet werden. Zu diesem Zweck ist eine Quelle des Nichtdeterminismus erforderlich, wie die durch a bereitgestellte Hardware -Zufallszahlengenerator.

Beachten Sie, dass eine negative Antwort auf die P = NP -Problem würde nicht implizieren, dass Programme mit nicht deterministischer Ausgabe theoretisch leistungsfähiger sind als solche mit deterministischer Ausgabe. Die Komplexitätsklasse NP (Komplexität) kann ohne Hinweis auf den Nichtdeterminismus definiert werden Verifier-basierte Definition.

Determinismuskategorien in Sprachen

Quecksilber

Das Merkur Die logischfunktionelle Programmiersprache legt verschiedene Determinismuskategorien für Prädikatmodi fest, wie in der Referenz erläutert.[8][9]

Haskell

Haskell Bietet mehrere Mechanismen:

  • Nichtdeterminismus oder Begriff des Versagens
    • das Vielleicht und Entweder Die Typen enthalten den Erfolg des Erfolgs im Ergebnis.
    • das scheitern Methode der Klassenmonade kann verwendet werden, um zu signalisieren scheitern als Ausnahme.
    • das vielleicht monad und Maybet Monad -Transformator sorgt für fehlgeschlagene Berechnungen (stoppen Sie die Berechnungssequenz und geben Sie nichts zurück)[10]
  • Kennzeichnung/Nichtdet mit mehreren Lösungen
    • Sie können alle möglichen Ergebnisse einer Mehrfachergebnisberechnung abrufen, indem Sie seinen Ergebnistyp in einen Monadplus einwickeln monad. (seine Methode MZERO lässt ein Ergebnis scheitern und Mplus Sammelt die erfolgreichen Ergebnisse).[11]

ML Familie und abgeleitete Sprachen

Wie in ... gesehen Standard ml, Ocaml und Scala

  • Das Möglichkeit Typ beinhaltet den Erfolg des Erfolgs.

Java

Im Java, das Null Der Referenzwert kann ein erfolgloses (Out-of-Domain-) Ergebnis darstellen.

Siehe auch

Verweise

  1. ^ Edward A. Lee. "Das Problem mit Threads" (PDF). Abgerufen 2009-05-29.
  2. ^ Bocchino Jr., Robert L.; Adve, Vikram S.; Adve, Sarita V.; Snir, Marc (2009). Die parallele Programmierung muss standardmäßig deterministisch sein. Usenix Workshop zu heißen Themen in Parallelität.
  3. ^ "Intel Parallel Inspector Thread Checker". Abgerufen 2009-05-29.
  4. ^ Yuan Lin. "Datenrennen und Deadlock -Erkennung mit Sun Studio Thread Analyzer" (PDF). Abgerufen 2009-05-29.
  5. ^ Intel. "Intel Parallel Inspector". Abgerufen 2009-05-29.
  6. ^ David Worthington. "Intel befasst sich mit dem Entwicklungslebenszyklus mit parallelem Studio". Archiviert von das Original am 2009-05-28. Abgerufen 2009-05-26.
  7. ^ McGraw, Gary; Viega, John. "Machen Sie Ihre Software verhalten: Zahlen spielen: Wie man im Online -Glücksspiel betrügt". Archiviert von das Original am 2008-03-13. Abgerufen 2007-07-02.
  8. ^ "Determinismuskategorien in der Quecksilberprogrammiersprache". Archiviert von das Original Am 2012-07-03. Abgerufen 2013-02-23.
  9. ^ "Quecksilberprädikatmodi". Archiviert von das Original Am 2012-07-03. Abgerufen 2013-02-25.
  10. ^ "Misserfolg darstellen mit dem vielleicht monaden".
  11. ^ "Die Klasse monadplus".