Algorithmus im Platz

In der Informatik ist ein Algorithmus im Platz (oder in Latein in situ) ein Algorithmus, der Eingang mit einer Datenstruktur mit einem kleinen, unveränderlichen Betrag des Extraabstellraums umgestaltet. Der Eingang wird gewöhnlich durch die Produktion überschrieben, weil der Algorithmus durchführt. Ein Algorithmus, der nicht in dem Platz ist, wird manchmal nicht in Platz genannt oder fehl am Platz.

Ein Algorithmus wird manchmal informell im Platz genannt, so lange er seinen Eingang mit seiner Produktion überschreibt. In Wirklichkeit ist das nicht genügend (wie der Fall der Schnellsortierung demonstriert), noch es notwendig ist; der Produktionsraum kann unveränderlich sein, oder darf zum Beispiel nicht sogar aufgezählt werden, wenn die Produktion zu einem Strom ist. Andererseits manchmal kann es praktischer sein, um den Produktionsraum in der Bestimmung aufzuzählen, ob ein Algorithmus, solcher als im ersten Rückbeispiel unten im Platz ist; das macht es schwierig, Algorithmen im Platz ausschließlich zu definieren. In Theorie-Anwendungen wie die mit dem Klotzraumverminderungen ist es typischer, um immer Produktionsraum zu ignorieren (in diesen Fällen es ist mehr notwendig, dass die Produktion das nur Schreiben ist).

Beispiele

Nehmen Sie an, dass wir eine Reihe von n Sachen umkehren wollen. Eine einfache Weise zu tun ist das:

fungieren Sie Rückseite ([0.. n])

teilen Sie b [0 zu.. n]

weil ich von 0 bis n

b [n - ich] = [ich]

geben Sie b zurück

Leider verlangt das, dass O (n) Extraraum die Reihe b schafft, und Zuteilung ist häufig eine langsame Operation. Wenn wir nicht mehr a brauchen, können wir ihn stattdessen mit seiner eigenen Umkehrung mit diesem Algorithmus im Platz überschreiben:

fungieren Sie reverse_in_place ([0.. n])

weil ich von 0 (um n/2) einen Boden zu legen

Tausch ([ich], [n-i])

Als ein anderes Beispiel gibt es mehrere Sortieren-Algorithmen, die Reihe in die sortierte Ordnung im Platz umordnen können, einschließlich: Luftblase-Sorte, Kamm-Sorte, Auswahl-Sorte, Einfügungssorte, Heapsort, Sorte von Shell.

Schnellsortierung wird als ein Algorithmus im Platz allgemein beschrieben, aber ist nicht tatsächlich ein. Die meisten Durchführungen verlangen O (loggen Sie n) Raum, um seinen zu unterstützen, teilst und überwindet recursion.

Die meisten Auswahl-Algorithmen sind auch im Platz, obwohl einige beträchtlich den Eingang umordnen

Reihe im Prozess, das endgültige, unveränderlich-große Ergebnis zu finden.

Einige Textmanipulationsalgorithmen solcher als ordentlich und Rück-können im Platz getan werden.

In der rechenbetonten Kompliziertheit

In der rechenbetonten Kompliziertheitstheorie schließen Algorithmen im Platz alle Algorithmen mit O (1) Raumkompliziertheit, die Klasse DSPACE (1) ein. Diese Klasse wird sehr beschränkt; es kommt den regelmäßigen Sprachen gleich. Tatsächlich schließt es keines der Beispiele sogar ein, die oben verzeichnet sind.

Deshalb denken wir auch Algorithmen in L, die Klasse von Problemen, die O verlangen (loggen Sie n) zusätzlicher Raum, um in dem Platz zu sein. Obwohl das scheint, unserer früheren Definition zu widersprechen, müssen wir denken, dass in der abstrakten Welt unser Eingang willkürlich groß sein kann. Auf einem echten Computer verlangt ein Zeigestock nur eine kleine feste verfügbare Fläche, weil der Betrag des physischen Gedächtnisses beschränkt wird, aber in General O (loggen Sie n), sind Bit erforderlich, einen Index in eine Liste der Größe n anzugeben.

Bedeutet das, dass Schnellsortierung schließlich im Platz ist? Überhaupt nicht — technisch verlangt es O (loggen Sie n) Raum seit jedem seiner O (loggen n), enthalten Stapel-Rahmen eine unveränderliche Zahl von Zeigestöcken (jede der Größe O (loggen Sie n)).

Das Identifizieren der Algorithmen im Platz mit L hat einige interessante Implikationen; zum Beispiel bedeutet es, dass es einen (ziemlich komplizierten) Algorithmus im Platz gibt, um zu bestimmen, ob ein Pfad zwischen zwei Knoten in einem ungeleiteten Graphen, ein Problem besteht, das O (n) Extraraum mit typischen Algorithmen wie Tiefensuche (ein besuchtes Bit für jeden Knoten) verlangt. Das gibt der Reihe nach Algorithmen im Platz für Probleme wie Bestimmung nach, wenn ein Graph zweiteilig oder prüfend ist, ob zwei Graphen dieselbe Zahl von verbundenen Bestandteilen haben. Sieh SL (Kompliziertheit)/SL für mehr Information.

Rolle der Zufälligkeit

In vielen Fällen können die Raumvoraussetzungen für einen Algorithmus durch das Verwenden eines randomized Algorithmus drastisch geschnitten werden. Sagen Sie zum Beispiel, dass wir wissen möchten, ob zwei Scheitelpunkte in einem Graphen von n Scheitelpunkten in demselben verbundenen Bestandteil des Graphen sind. Es gibt keinen bekannten einfachen, deterministischen, Algorithmus im Platz, um das zu bestimmen, aber wenn wir einfach an einem Scheitelpunkt anfangen und einen zufälligen Spaziergang ungefähr 20n Schritte durchführen, ist die Chance, dass wir über den anderen Scheitelpunkt stolpern werden vorausgesetzt, dass es in demselben Bestandteil ist, sehr hoch. Ähnlich gibt es einfachen randomized Algorithmen im Platz für primality Prüfung wie der Müller-Rabin primality Test, und es gibt auch einfache randomized Factoring-Algorithmen im Platz wie der rho Algorithmus von Pollard. Sieh RL und BPL für mehr Diskussion dieses Phänomenes.

In der funktionellen Programmierung

Funktionelle Programmiersprachen entmutigen häufig oder unterstützen ausführliche Algorithmen im Platz nicht, die Daten überschreiben, da das ein Typ der Nebenwirkung ist; statt dessen erlauben sie nur neuen Daten, gebaut zu werden. Jedoch werden gute funktionelle Sprachbearbeiter häufig anerkennen, wenn ein einem vorhandenen sehr ähnlicher Gegenstand geschaffen wird und dann der alte weggeworfen, und das in eine einfache Veränderung "unter der Motorhaube" optimieren wird.

Bemerken Sie, dass es im Prinzip möglich ist, Algorithmen im Platz sorgfältig zu bauen, die Daten nicht modifizieren (wenn die Daten nicht mehr verwendet werden), aber das wird in der Praxis selten getan. Sieh rein funktionelle Datenstrukturen.

Siehe auch


Eheregime / Actinobacteria
Impressum & Datenschutz