【问题标题】:Time Complexity of Interval Sum区间和的时间复杂度
【发布时间】:2017-02-14 01:54:30
【问题描述】:

我试图了解算法的时间复杂性并遇到了这个问题。问题是计算区间总和(0

public static void main(String args[]){
    LinkedList<Integer> l=new LinkedList<Integer>();
    l.add(4);
    l.add(2);
    l.add(3);
    l.add(1);
    l.add(5);

    int k=2;

    List result = new ArrayList();
    int n = l.size();

    for(int i = 0; i < n; i++){
        if(i >= k-1){
            int sum = 0;
            for(int j = i; j >= i-k+1; j--){
                sum += in.get(j);
            }
            result.add(sum);
        }
    }
    System.out.println(result);
}

谁能解释一下上述代码的时间复杂度?是 n*k 还是 n^2(因为 k 的最大值是 n)。 if 条件会影响时间复杂度吗?

【问题讨论】:

    标签: java algorithm time time-complexity


    【解决方案1】:

    内部循环执行了 O(n-k) 次,因为 if 有这么多次,也就是 O(n)。
    内部循环是 O(k) - 它迭代了多少次。

    那么整个算法就是O(n) * O(k) = O(n * k)。

    你可以说它是 O((n - k) * k),但对于 k

    对于 k 的大小接近 n 的边缘情况,复杂度将是 O(n),因为 if 将是真正的 O(1) 次,而内部循环将是 O(k),这对于 k ~ n 是 O(n),所以总体上是 O(n)。

    【讨论】:

    • 谢谢。这对我帮助很大。
    • 这是否意味着,最好的情况是 O(n)(for k ~ n) 而最坏的情况是 O(n*k)(for k
    • @user1092:您的代码是 O(n * k),但是存在不考虑 k 值的纯 O(n) 解决方案。
    • @algojava 虽然这是真的,但与问题无关
    • @Bohemian:我知道,我只是为他分享信息。
    猜你喜欢
    • 2013-09-12
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多