算法的运行时间

时间:2014-01-23 01:39:59

标签: java algorithm runtime

我试图弄清楚以下算法的运行时间。 我认为它是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]);
    }
  }
}

3 个答案:

答案 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*NN^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)。