我一直在解决破解编码面试中的问题以准备一些采访。我能够解决堆栈排序问题,但我很难弄清楚如何推断时间复杂性。我的解决方案与书中提供的解决方案非常相似,我已经对它进行了相当多的测试,所以我确信它是正确的。对于分析该算法所经历的思考过程的任何洞察都将非常感激。这本书说它是O(n ^ 2)。这是算法:
def sort_stack(stack):
temp_stack = Stack()
while not stack.is_empty():
v = stack.pop()
if temp_stack.is_empty() or temp_stack.peek() <= v:
temp_stack.push(v)
else:
while not temp_stack.is_empty() and temp_stack.peek() > v:
stack.push(temp_stack.pop())
temp_stack.push(v)
while not temp_stack.is_empty():
stack.push(temp_stack.pop())
作为旁注:我使用这种方法对堆栈进行排序,以便在问题的约束范围内。我知道存在更快的解决方案。
提前谢谢。
答案 0 :(得分:2)
考虑最坏的情况,其中对堆栈中的每个项目进行排序需要完全清空临时堆栈。 (当尝试对反向排序的堆栈进行排序时会发生这种情况。)
清空/重新填充每个项目的临时堆栈的成本是多少? 有多少项?
组合这些应该给出O(n ^ 2)。
答案 1 :(得分:1)
这可能是一种过于简化的算法分析方法,但每当我看到嵌套循环时,我认为n ^ 2。嵌套的三个循环 - n ^ 3等。作为简单程序的经验法则,计算嵌套循环。这是一个非常有用的教程:http://cs.lmu.edu/~ray/notes/alganalysis/