【问题标题】:How to measure the time-complexity (Big-O) of this algorithm?如何测量该算法的时间复杂度(Big-O)?
【发布时间】:2016-07-06 19:58:19
【问题描述】:

我正在尝试测量以下算法的大 O 复杂度:

int sumSome(int[] arr){
   int sum = 0;
   for (int i=0; i<arr.length;  i++) {
      for (int j=1; j<arr.length; j = j*2) {
         if (arr[i] > arr[j])
            sum += arr[i];
      }
   }
   return sum;
}

根据我的理解,

if (arr[i] > arr[j])
                sum += arr[i];

具有 O(1) 的大 O,因为它是恒定的并且什么都没有发生,尽管我很难尝试辨别它的 Big-O 符号,但听起来它的 for 循环。我以为

for (int j=1; j<arr.length; j = j*2) {
         if (arr[i] > arr[j])
            sum += arr[i];
}

是一个线性函数 O(n),因为 j 可能为 1,但它在 O(2n) 处以线性方式上升,即 O(n)。那么整个算法不会是O(n ^ 2)吗?显然我在 MOOC 考试中没有正确回答问题。谢谢!

【问题讨论】:

  • 我不知道你是怎么得到2n的。如果有的话,那就是n/2(这对 Big-O 来说并不重要)
  • 当然,n/2其实是给j = j+2

标签: java algorithm time-complexity big-o asymptotic-complexity


【解决方案1】:

是一个线性函数 O(n),因为 j 可能为 1,但它在 O(2n) 处以线性方式上升,即 O(n)。所以整个算法不会是 O(n^2)。显然我在 MOOC 考试中没有正确回答问题。谢谢!

它不是呈线性上升,而是呈指数上升,因为每次迭代都将j 乘以2

j = 1, 2, 4, 8, 16, 32, ..., 2^k < n
2^k < n | apply log base 2 => k < log_2 n => k = O(log n)

所以第二个循环只执行了O(log n)次,使得整个代码序列O(n log n)

严格来说,O(n^2) 也是正确答案,因为如果O(n log n) 是一个上限,那么O(n^2) 也是。但是,n^2 的 Big Theta 是不正确的,人们通常也使用 Big-Oh 来指代紧密的界限。

【讨论】:

  • 这是什么意思?:如果 O(n log n) 是一个上限,那么 O(n^2) 也是如此。上限?
  • 哦,等等,我想我明白了。既然我们在谈论 Big O,那么 O(log n) 实际上就是 O(n^2)
  • @dabadaba 注意 big-oh 的定义(有点简化):如果f(x) = O(g(x)),那么|f(x)| &lt;= |c*g(x)| 足够大x。所以如果g乘以一个常数总是大于f。所以g 限制f 以上,所以是一个上限。这就是我的意思。 O(log n) = O(n) = O(n^2),是的(将= 读作belongs to)。
【解决方案2】:

Big-O 的关键在于寻找循环,因此您的关键部分在这里:

for (int i=0; i<arr.length;  i++) {
   for (int j=1; j<arr.length; j = j*2) {
      if (arr[i] > arr[j])
         sum += arr[i];
   }
}

外部循环执行 N 次,因为它从 0 到 N 以 1 为增量。

内部循环每次外部迭代执行 Log N 次,因为它从 1 到 N 以指数方式执行。 (我怀疑你错过的部分是循环中的迭代器:j = j*2。这使得 J 呈指数增长,而不是线性增长,所以它会在 log-base-2 时间内达到 N。如果它是线性的+2,而不是*2)

if 内部对于 Big-O 来说无关紧要,因为它只是增加了一个系数。

所以,只需将循环的顺序相乘:N * Log N = N Log N

【讨论】:

  • 很好的解释,谢谢!我不知道哪一个标记为最佳答案希望我可以同时做,但是既然你先回答了......
猜你喜欢
  • 2021-04-30
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2023-03-27
  • 2016-06-30
相关资源
最近更新 更多