【发布时间】:2013-07-22 16:34:20
【问题描述】:
问题几乎在标题中,但说我有一个列表 L
L = [1,2,3,4,5]
min(L) = 1 这里。现在我移除 4。最小值仍然是 1。然后我移除 2。最小值仍然是 1。然后我移除 1。最小值现在是 3。然后我移除 3。最小值现在是 5,依此类推。
我想知道是否有一种好方法可以随时跟踪列表的最小值,而无需执行 min(L) 或扫描整个列表等。
实际从列表中删除项目会产生效率成本,因为它必须将其他所有内容移过来。每次重新排序列表也很昂贵。有没有办法解决这个问题?
【问题讨论】:
-
如果列表按照上面的方式排序,而不仅仅是
list[0]? -
保留排序列表的副本,然后是 alist[0]?
-
从列表中删除元素是有代价的,因为它必须将其他所有内容都移过来。我想知道是否有更好的方法可以使用静态数组来做事。
-
可以有辅助数据结构吗?或者您是否正在尝试就地执行此操作?它必须是一个列表还是可以是其他东西?
-
@JohnSmith 我认为你搞砸了。如果列表中没有排序,并且您没有在其他地方保留列表的有序版本,那么每次更新都是 O(n)。使用辅助列表,删除是 O(1),插入是 O(n),使用辅助堆 O(log n) 对于两者。