python 的 list 效率底下?

2014-11-11 19:49:55 +08:00
 janstk

题目

Design a stack that supports push, pop, top, and retrievingthe minimum element in constant time.

答案:

class MinStack:
    def __init__(self):
        self.L=[]
    def pop(self):
        return self.L.pop()
    def push(self,x):
        self.L.append(x)
    def top(self):
        return self.L[-1]
    def getMin(self):
        tmpL = self.L[:]
        tmpL.sort()
        return tmpL[0]

每次提示答案都超时…表吐槽,表示刚学python

7881 次点击
所在节点    Python
43 条回复
Altynai
2014-11-11 20:13:04 +08:00
你getMin复杂度都O(nlogn)了,题目说了**constant time**
takato
2014-11-11 20:41:20 +08:00
常数级复杂度,只要额外维持一个最小值就可以了
bcxx
2014-11-11 21:07:48 +08:00
@takato 不是一个,是最小值的历史记录
wheatcuican
2014-11-11 21:21:13 +08:00
大力哥好!
wzzyj8
2014-11-11 22:58:35 +08:00
getmin用list改用tuple,至少快10倍。


bcxx
2014-11-11 23:47:32 +08:00
@wzzyj8 看题……不是 list 本身的问题- -
staticor
2014-11-12 00:20:04 +08:00
另外生成一个最小栈, push时比一下.
ivanlw
2014-11-12 00:55:48 +08:00
好经典的蒂姆
rwalle
2014-11-12 07:33:40 +08:00
目测楼主以前没学过编程?经验太少 getMin这么简单的事情用sort就是杀鸡用牛刀
ryd994
2014-11-12 07:59:21 +08:00
每次插入都和当前最小比较一下,小于就换
每次pop就要重新sort了
ryd994
2014-11-12 07:59:46 +08:00
pop可能要重新sort
openroc
2014-11-12 08:27:18 +08:00
gt11799
2014-11-12 08:37:29 +08:00
题主是只想实现一个可以取最小值的栈?
heapq是一个最小堆,内部应该是一个二叉树,父节点始终小于子节点,因此顶点是最小的数。每当取出一个值,则两个子节点对比,小的上升。(实际上不是如此,不过这样容易理解)
可以先使用heapq把这个类实现了,然后试试看,自己能不能写一个最小堆?
msg7086
2014-11-12 08:48:59 +08:00
@gt11799
我看题目里的要求,应该不是说要做小顶堆吧。应该是双stack,一个维护数据,另一个维护最小值。
fkue0487
2014-11-12 08:52:05 +08:00
不是有个min函数么.
xcv58
2014-11-12 08:57:30 +08:00
人家要 O(1) 你给弄个 O(n log n) Python 躺枪啊。
rrfeng
2014-11-12 09:26:15 +08:00
维护『一个』最小值的话 pop 了咋办?
zhchbin
2014-11-12 09:28:59 +08:00
```python
class MinStack:
def __init__(self):
self.data = []
self.min_data = []

def pop(self):
if not self.data:
return None

self.min_data.pop()
return self.data.pop()

def push(self, x):
self.data.append(x)
if not self.min_data:
self.min_data.append(x)
else:
self.min_data.append(min(self.min_data[-1], x))

def top(self):
return None if not self.data else self.data[-1]

def getMin(self):
return None if not self.data else self.min_data[-1]

if __name__ == '__main__':
min_stack = MinStack()
data = [5, 2, 4, 3, -1, 0]
for val in data:
min_stack.push(val)
print min_stack.getMin()

min_stack.pop()
print min_stack.getMin()
min_stack.pop()
print min_stack.getMin()
```

经典的面试题目,刚学python,不知道写对了木有。
zhchbin
2014-11-12 09:30:35 +08:00
囧。。还以为支持Mardown直接回复了。。自行缩进吧。
frankzeng
2014-11-12 09:35:24 +08:00
return min(self.L)不就行了吗,干嘛自己实现?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/145709

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX