Wenn ich will, in konstanter Zeit ein Minimum Element in einem Stapel (Integer-Schlüssel), finden, dann kann es wie folgt erfolgen:Finding minumum Element in einem Stapel in konstanter Zeit
arr = [ 10, 7, 15, 12, 5 ]
min_stack = []
main_stack = []
def get_min():
if len(min_stack) < 1:
return None
return min_stack[-1]
def push(key):
main_stack.append(key)
if len(min_stack) < 1 or min_stack[-1] > key:
min_stack.append(key)
def pop():
key = main_stack.pop()
min = get_min()
if key == min:
min_stack.pop()
return key
for key in arr:
push(key)
In der obigen Lösung Es ist möglich, min
Wertelement in O(1)
herauszufinden, aber es verwendet einen Hilfsspeicher der Größe n
.
Gibt es einen Weg, dass es ohne Verwendung einer n
Größe Speicher oder sagen Konstanten Speicher, durch Ausnutzung der arithmetischen Eigenschaften der Integer-Taste erfolgen kann.
Wollen Sie nur die min Element finden? Sie können das minimale Element in einer Variablen speichern und jedes Mal aktualisieren, wenn Sie etwas drücken. – Haris
Wie @Haris erwähnt hat, können Sie einen Verweis auf das Minimum beibehalten, indem Sie jedes Mal aktualisieren, wenn Sie den Stapel ändern - z. Wenn du etwas drückst oder poppst, überprüfst du es und aktualisierst es vielleicht. Dies bedeutet jedoch, dass "pop" in O (N) Zeit statt O (1) für einen traditionellen Stapel enden könnte. Wenn Sie in Ordnung sind, wenn Sie einen Heapspeicher verwenden, um alles im Stack zu speichern, können Sie dies möglicherweise auf O (logN) reduzieren, aber auf Kosten des Speichers. – mgilson
Was genau wäre der Vorteil gegenüber dem guten alten 'min()'? –