【发布时间】:2022-09-23 04:56:53
【问题描述】:
对于下面代码的最坏情况分析,我认为它是 O(n^2),但是我的教授声明它的 O(n),认为每个元素的最大操作量是 2(一次推送和一次弹出) )。
- 既然是
if-statement,不就是一个吗? push 和 pop 的表现如何? - 如果这是“最坏情况”,为什么我们不能争辩首先推送 n-1 个元素,然后在最后一次迭代中遍历整个堆栈,从而导致 O(n^2)?
void foo (int n){
Stack<int> stack = new Stack();
i = 0;
while (i < n) {
int key = random int from 1 to n
if (key is odd)
stack.push(key);
else {
j = 0;
while (j < key and !stack.isEmpty()){
stack.pop();
j = j + 1;
}
i = i + 1;
}
}
-
如果你在数苹果,你知道你可以拿走它们,将它们重新组织成组,然后数组。您可以以任何方便的方式重新排列它们。你的教授只是用工作而不是苹果来做这件事。他可以重新排列已完成的工作单元并进行统计。他只是按照完成的元素对工作进行分组。
-
你是两个都完全正确。最坏的情况它做最多取
O(n),有n个步骤,所以这是O(n^2)。然而,这已经摊销由O(1)表示 n - 1,所以也是O(n - 1 + n) = O(2n-1) = O(n);这是一个更严格的界限。 -
@Neil:你是对的,但是OP关于最后一次迭代的论点是错误的,因为只有最后一次......
标签: algorithm if-statement time-complexity big-o complexity-theory