4 Stimmen

Einen Stack entwerfen, der auch in O(1) amortisierter Zeit entladen werden kann?

Ich habe einen abstrakten Datentyp, der als eine von links nach rechts gespeicherte Liste mit den folgenden möglichen Operationen betrachtet werden kann: Push: Hinzufügen eines neuen Eintrags am linken Ende der Liste Pop: Entfernen des Eintrags am linken Ende der Liste Pull: Entfernen des Eintrags am rechten Ende der Liste

Implementieren Sie dies mit drei Stapeln und konstantem zusätzlichem Speicher, so dass die amortisierte Zeit für jede Push-, Pop- oder Pull-Operation konstant ist. Die Stapel haben grundlegende Operationen, isEmpty, Push und Pop.

Amortisierte Zeit bedeutet: "Wenn ich diese Menge an Zeit aufbringe, kann ich einen weiteren Block davon aufbrauchen und ihn in einer Zeitbank speichern, um ihn später zu verwenden", z. B. für jede Push-Operation drei Blöcke konstanter Zeit, so dass Sie für jedes geschobene Element zwei zusätzliche Blöcke konstanter Zeit haben.

0 Stimmen

Natürlich, aber ich nehme an, das spielt keine Rolle, es ist eine interessante Frage und ich würde gerne die Lösung hören.

0 Stimmen

Hausaufgaben oder nicht beeinflussen die Art und Weise, wie zu antworten ist. Bei Hausaufgaben sollte man das Denken anregen und nicht einfach einen Code ausgeben, oder?

10voto

MarkusQ Punkte 21488

Ich stelle ein paar Vermutungen an:

  1. Dass dies eine Hausaufgabe ist
  2. dass dieser Absatz Teil des Auftrags ist

Dies wird mit drei Stapeln und konstantem zusätzlichem Speicher, so dass die amortisierte Zeit für jede Push-, Pop, oder Pull-Operation konstant ist. Die Stapel haben grundlegende Operationen, isEmpty, Push und Pop.

Dann wäre mein erster Rat, die Leute zu ignorieren, die mit Ihnen über verknüpfte Listen sprechen. Stimmt, so würde es jeder vernünftige Mensch umsetzen ohne das Erfordernis von drei Stapeln, Aber das Wichtigste bei Hausaufgaben ist nicht, dass man sie so macht, wie es ein vernünftiger Mensch tun würde, sondern wie es der Lehrer von einem verlangt.

Mein zweiter Ratschlag wäre, ein paar Blöcke, ein Kartenspiel oder einen Haufen Styroporbecher zu besorgen und drei Stapel zu bilden (z. B. mit Untersetzern oder so). Spielen Sie damit, was passiert, wenn Sie den Inhalt eines Stapels auf einen anderen übertragen, und Sie sollten eine Vorstellung davon bekommen.

0 Stimmen

@sflossen Bis zu einem gewissen Punkt stimme ich zu, aber ich denke, das Ziel der Aufgabe ist wahrscheinlich, dass sie die Stapelsemantik verinnerlichen. Wenn das Lesen der Aufgabenstellung nicht ausreicht, ist wahrscheinlich praktische Erfahrung gefragt.

3voto

sfossen Punkte 4704

Du könntest etwas machen, das nur die 3 Stapel verwendet. Denken Sie an Turm von Hanoi .

2voto

Joel Coehoorn Punkte 377088

Verwenden Sie eine doppelt verkettete Liste und behalten Sie Verweise auf den Kopf und das Ende. Für den Rest müssen Sie zuerst Ihren eigenen Code schreiben und sich dann von uns helfen lassen, ihn zu korrigieren.

0 Stimmen

Dies ist wahrscheinlich die beste Art, das Ding zu bauen, weil es keine künstliche Größenbegrenzung gibt, aber es ist relativ komplex.

0 Stimmen

Ein gutes Beispiel für eine doppelt verknüpfte Liste (in Actionscript) finden Sie unter www.polygonal.de.

0voto

Captain Segfault Punkte 1636

Beginnen Sie mit der Implementierung einer Warteschlange in Form von zwei Stapeln (ein ziemliches Standardproblem) und verallgemeinern Sie.

0 Stimmen

Das ist es, was ich an dieser Frage nicht verstehe. Hat die "Standard"/Okasaki-Lösung mit zwei Listen nicht eine amortisierte Zeit von O(1) für die Entleerung?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X