【发布时间】:2016-08-12 03:33:11
【问题描述】:
如果我想在堆栈中找到一个最小元素(整数键),那么它可以在恒定时间内完成:
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)
在上述解决方案中,可以在O(1) 中找到min 值元素,但它使用大小为n 的辅助内存。
有没有一种方法可以在不使用n 大小的内存或说常量内存的情况下通过利用整数键的算术属性来完成。
【问题讨论】:
-
您只想找到最小元素吗?您可以将最小元素存储在变量中,并在每次推送时更新它。
-
正如@Haris 所提到的,您可以通过在每次更改堆栈时更新它来保持对最小值的引用——例如如果你推送或弹出你检查的东西,也许会更新。然而,这意味着
pop最终可能在 O(N) 时间内运行,而不是传统堆栈的 O(1)。如果您可以使用堆将所有内容存储在堆栈中,则可以将其降低到 O(logN),但会以内存为代价。 -
与旧的
min()相比究竟有什么优势? -
@KlausD。 --
min在 O(N) 时间内运行。如果您想在其他操作之上优化find_min函数(可能是因为它被调用更多?)那么保留这些数据可能是有利的。 -
@KlausD。我不想详细讨论这个讨论,但是
push() == constant time和get_min() == constant time所以推动和获得最小的行为是恒定的时间。常数时间是指与堆栈大小相关的时间变化,在此实现中,这些函数的执行时间不随堆栈大小而变化。