我试图弄清楚以下算法的运行时间。 我认为它是O(n)因为内部循环不依赖于外部循环。 所以我们可以得到O(n)+ O(n)= O(2n)等于O(n) 它是否正确?我不确定我的逻辑是否正确,我无法弄清楚如何正确分析。
该算法正在查找元素列表左侧的最大元素。 谢谢!
public static void main(String[] args){
int[] a = {4,3,2,10,4,8,9,1};
int[] p = new int[a.length];
ArrayDeque<Integer> previousIndex = new ArrayDeque<Integer>();
for(int i = 0; i < a.length ; i++){
while (!previousIndex.isEmpty() && a[previousIndex.peek()] <= a[i]){
previousIndex.pop();
}
if (previousIndex.isEmpty()) {
p[i] = 0;
} else {
p[i] = previousIndex.peek();
}
previousIndex.push(i);
}
for(int i = 0; i < p.length ; i++){
System.out.println(p[i]);
}
}
}
答案 0 :(得分:1)
这是O(N),虽然你在一个循环中有一个循环,内循环执行的总次数永远不会超过总次数
previousIndex.push(i);
调用,即a.length(或N)
答案 1 :(得分:0)
要确定你正在查看最糟糕的情况。你是正确的,嵌套循环是引起关注的原因:
for(int i = 0; i < a.length ; i++){
这是立即命令N
while (!previousIndex.isEmpty() && a[previousIndex.peek()] <= a[i]){
这可能也会发生近N次。
所以最终订单是N*N
或N^2
你必须记住通常情况。如果只有几次迭代后,while循环可能实际上会退出,那么你可以回到O(N)
。
答案 2 :(得分:0)
事实上,你很好并且有一个O(N)算法 - 但它比大多数人更难证明。但是,假设.isEmpty()
上的.peek()
,ArrayDeque
等都是常量操作。请查阅文档以确定。
关键是你在内循环中处理deque
是破坏性的:
while (!previousIndex.isEmpty() && a[previousIndex.peek()] <= a[i]){
previousIndex.pop();
}
每次都会从previousIndex
中删除一个元素,并且只能在有一个要删除的元素时运行。因此,while
循环可以在所有索引中运行的总次数是.push
变为deque的次数。因为这只发生在一个点 - 在第一个for
循环结束时 - 我们可以看到推送的项目数是O(N)。