【问题标题】:Time Complexity Review时间复杂度审查
【发布时间】:2015-12-04 20:38:38
【问题描述】:

以下代码 sn-p 的时间复杂度是多少?

int[][] A = new int [n][];
for (int i=0; i<n; i++) {
    if (i % 2 == 0) // i is a multiple of 2
        A[i] = new int [n];
    else
        A[i] = new int [1];
}

for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++)
        sum = sum + A[i][j];

我了解第一个for循环循环n次,那么,将有n/2行长度为n的矩阵,n/2长度为1。总时间是n^2吗?

【问题讨论】:

    标签: time big-o time-complexity


    【解决方案1】:

    是的,复杂度将是 O(n2)。


    怎么做?

    • 一半的时间(即 n/2 次),您将遍历 n 个元素 = (n/2) * n = n2/2。
    • 一半的时间(同样是 n/2 次),您将只有一个元素需要迭代 = (n/2) * 1 = n/2。
    • 因此,整体复杂度 = O(n2/2 + n/2) = O(n2)

    【讨论】:

    • 太棒了!感谢您的确认:)
    • 关于 big-O 的很好的解释 :)
    【解决方案2】:

    首先让我们用术语来决定。例如,假设每个操作都等于1。让我们获取您的代码(只是为了保持一致 - 我们将调用此方法)并逐行执行。

    int[][] A = new int [n][];
    

    这将等于1

    for (int i=0; i<n; i++) {  
    

    这里我们有循环,最坏的情况是n

        if (i % 2 == 0) // 1
            A[i] = new int [n]; // 1
        else
            A[i] = new int [1]; // 1
    }
    

    以上操作可算1个。

    for (int i=0; i<A.length; i++) 
    

    循环等于n-elements。

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

    内循环相同n

            sum = sum + A[i][j];
    

    这将再次等于1

    内循环是相乘,所以你是对的,但要考虑到这将是大 O 符号 O(n2)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多