【问题标题】:Time Complexity of Simple Algo简单算法的时间复杂度
【发布时间】:2013-10-05 00:14:32
【问题描述】:

我正在尝试计算下面代码的运行时间。

如果add和trimToSize都是O(n),那么block内部会运行2N时间,那么由于循环需要N时间,那么整个程序会运行N*(2N)时间?... O(n^2)?

ArrayList a = new ArrayList();

for (int i = 0; i< N; i++){
    a.add(i);
    a.trimToSize();
}

【问题讨论】:

    标签: java time complexity-theory


    【解决方案1】:

    是的。但是ArrayList#add 通常是O(1),除非需要增加内部存储阵列。

    如果您想优化您的代码,请按以下步骤操作:

    ArrayList a = new ArrayList(N); // reserve space for N elements
    
    for (int i = 0; i < N; i++) {
        a.add(i); // O(1)
    }
    
    // no need for trimToSize
    

    现在只有 O(n)

    【讨论】:

    • 谢谢,非常感谢!
    【解决方案2】:

    你是对的,应该是 O(n^2)。 for 循环执行 N 次,就像你说的,addtrimToSize 需要 O(n) 时间,所以它是:

    N * (N + N) = N * (2N) = 2 * N^2

    但是常数因子 2 对 big-O 表示法并不重要,因为 n^2 是函数的主要部分。因此,它是 O(n^2)。

    【讨论】:

    • 感谢您的回复!
    猜你喜欢
    • 2010-12-10
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多