Ich möchte damit beginnen, dass dies KEINE Hausaufgabe ist. Ich lese Einführung in Algorithmen - den berühmten CLRS-Text, um ein besserer Programmierer zu werden. Ich versuche, die im Buch angegebenen Probleme und Übungen selbst zu lösen.
Ich versuche, Übung 10.1-2 aus Kapitel 10 Elementare Datenstrukturen aus CLRS Second Edition zu lösen . Hier ist was seine Zustände:
Erklären Sie, wie Sie zwei Stapel in einem Array A [1..n] so implementieren , dass keiner der Stapel überläuft, es sei denn, die Gesamtzahl der Elemente in beiden Stapeln beträgt n . Die PUSH- und POP-Operationen sollten in O (1) -Zeit ausgeführt werden.
Die Lösung, die ich bisher gefunden habe, ist:
Lassen Sie Array A [1..n] zwei Stapel implementieren: S1 [1..i] und S2 [i..n] .
Wenn für die Operationen PUSH-S1 und PUSH-S2 der Stapel "voll" ist, beginnen Sie, Elemente in den anderen Stapel zu schieben (z. B. wenn der Stapel S1 voll ist, wenn versucht wird, ein neues Element einzuschieben, schieben Sie dieses Element hinein Stapel S2 und umgekehrt).
Das Problem bei diesem Ansatz ist, dass ich nicht in der Lage sein werde, POP-S1 oder POP-S2 zuverlässig auszuführen, da es keine Möglichkeit gibt, sich zu merken, welches Element zu welchem Stapel gehört. Wenn es sich bei den Elementen des Stapels um (Schlüssel-, Wert-) Paare handelt, wobei der Schlüssel die Stapelnummer ist, müsste ich im schlimmsten Fall i- oder (ni) -mal suchen, um ein Element zu platzieren. Dies ist O (n) ) (zögern Sie nicht mich zu korrigieren, wenn ich mich hier irre), das wäre nicht O (1) .
Ich habe mich jetzt schon eine ganze Weile mit der Frage beschäftigt. Bin ich auf dem richtigen Weg? Kann jemand meine möglichen Hinweise zur Lösung dieses Problems geben?
Wie sollte ich im Allgemeinen über diese Probleme nachdenken? Oder können nur wirklich intelligente Menschen solche Probleme lösen? Wird es mir dabei helfen, Probleme wie diese anzugehen / zu lösen (dh Erfahrungen zu sammeln), besser zu werden?
Ich warte auf Erleuchtung.