【问题标题】:What is the runtime of the inner loop?内循环的运行时间是多少?
【发布时间】:2019-06-22 22:03:52
【问题描述】:

我创建了一个函数,它循环遍历数组并打印数组的任意两个值,这两个值可以加起来为值 K。外部 for 循环是 O(n),但内部循环对我来说有点混乱,如果运行时间是 O(Log n) 或 O(n)。你能帮忙吗?谢谢!!

int canMakeSum(int *array, int n, int key){
  int i, j;

  for(i = 0; i < n; i++){
    for(j = (i+1); j < n; j++){
      if(array[i]+array[j] == key){
        printf("%d + %d = %d\n", array[i], array[j], key);
      }
    }
  }
}

【问题讨论】:

  • 内循环运行 (n-1) + (n-2) + ... + 1 = n*(n-1)/2 次。加起来总共 O(n^2)

标签: c algorithm search runtime


【解决方案1】:

正如其他人已经表明的那样,内部循环仍然是 O(n);它是 n/2 次迭代的平均值,值 1 到 n 均匀分布在外循环的迭代中。

是的,您可以在 O(n log n) 内解决问题。

首先,对数组进行排序;这是n log n。现在,您有一个线性 (O(n)) 过程来查找所有组合。

lo = 0
hi = n-1

while lo < hi {
   sum = array[lo] + array[hi]
   if sum == k {
       print "Success", array[lo], array[hi]
       lo += 1
       hi -= 1
   }
   else if sum < k        // need to increase total
       lo += 1
   else                   // need to decrease total
       hi -= 1

【讨论】:

    【解决方案2】:

    虽然内循环在外循环的每次迭代中扫描的项目数减少了,但它仍然是 O(n)。整体时间复杂度为O(n^2)。

    假设您有一个包含 25000 个元素的数组。在i = 0j = 1 的起点处,j 将迭代的元素数量(最坏情况下没有与键匹配)是 24999 个元素。这与元素总数的差异很小,所以它“像”穿过 n 个元素。

    【讨论】:

    • 知道了!!谢谢你。有没有办法增强整个函数的算法,使其成为 O(n) 或 O(n log n)?
    【解决方案3】:

    由于内部循环取决于外部循环的值,如果不一起分析两者,您将无法找到整个 porgram 的复杂性。内循环的复杂度为n - i - 1

    如果你想计算程序的复杂度,你可以将n - i -1i = 0求和到i = n - 1。因此,总复杂度为T(n) = (n - 1) + (n-2) + ... + 1 + 0 = (n-1)n/2 = \Theta(n^2)(因为内部循环中的语句具有恒定复杂度 (\Theta(1)))。

    【讨论】:

    • 知道了!!谢谢你。有没有办法增强整个函数的算法,使其成为 O(n) 或 O(n log n)?
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-11-28
    • 2015-06-17
    相关资源
    最近更新 更多