【问题标题】:Big O Time Complexity of effectively equivalent statements有效等价语句的大 O 时间复杂度
【发布时间】:2013-09-12 00:48:02
【问题描述】:

假设您有算法 1(将实例化数组中的每个元素初始化为 0):

intArray[0] = 0;
intArray[1] = 0;
...
intArray[intArray.length - 1] = 0;

和算法2:

for( int i = 0; i < intArray.length; i++)
     intArray[i] = 0;

它们的时间复杂度是否相等?我被教导要考虑比较和分配,在我看来,算法 1 的比较次数比算法 2 少intArray.length,因此需要一半的时间。

【问题讨论】:

  • “大哦”时间复杂度不关心“一半时间”。而是随着输入大小的增长,算法时间的行为。

标签: java for-loop big-o time-complexity assignment-operator


【解决方案1】:

它们都是 O(N)。常数因素根本不会影响复杂性(尽管它们可能会影响您在实践中选择哪一个)。

O(N) 意味着算法的运行时间总是小于k * N 对于一些 k。 k 在不同情况下可能不同。

O(N) 告诉你的只是,如果你把问题放大两倍,它会花费两倍的时间。 (而对于 O(N**2) 来说,将问题放大两倍则需要四倍的时间,依此类推。)

【讨论】:

    【解决方案2】:

    显然它们是 O(N)。不过我想补充一点。

    如果在编译时没有定义initArray,你甚至不能写第一块代码。

    如果initArray是在编译时定义的,这意味着initArray是静态初始化的,仍然不需要像第一个代码块那样写。

    int score[]={0,0,0,0,0};
    

    initArray.length 为 5,更简洁。

    所以大多数时候,像第一个块这样的代码是可以避免的。

    【讨论】:

    • Java 中的数组总是有一个length 属性。没有必要明确定义它。不可能是编译时没有定义的。
    • @Jesper 我的意思是 initArray 而不是长度。如果数组是动态初始化的,则 initArray.length 在编译时是未知的。例如 int score[] = new int[n],其中 n 为整数变量。
    • 在这个问题中,我假设数组已定义但未实例化;鉴于数组存在,我想比较两种可能的实例化数组的方式。
    • @user2758704 数组长度比较小就没意义了,如果数组长度很大的话代码就太长了,比如100万,那么10^6行代码?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2014-05-29
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多