【问题标题】:What should be the time complexity of the given function in terms of Big O?就 Big O 而言,给定函数的时间复杂度应该是多少?
【发布时间】:2021-06-12 11:28:43
【问题描述】:
int find_peak (int n, int A []) {
    int left, right, lmid, rmid;
    left = 0;
    right = n - 1;
    while (left + 3 <= right) {
        lmid = (2 * left + right) / 3;
        rmid = (left + 2 * right) / 3;
        if (A[lmid] <= A[rmid])
            left = lmid;
        else
            right = rmid;
    }
    int x = left;
    for (int i = left + 1; i <= right; i ++)
        if (A[i] > A[x])
            x = i;
    return A[x];
}

我试图解决这个函数的 BigO 表示法,但我对此感到非常困惑。是 O(log n) 还是别的什么?我可以在脑海中解决它,但我不能正确地解决它。

【问题讨论】:

  • 请正确缩进您的代码。这几乎是可读的。

标签: c time-complexity big-o complexity-theory


【解决方案1】:

是的,循环在每次迭代中大致减半

lmid = (2 * left + right) / 3;
rmid = (left + 2 * right) / 3;
if (A[lmid] <= A[rmid])
    left = lmid;
else
    right = rmid;

准确地说是 log1.5(n),因为实际长度 right-left 仅减少 1/3,不减半迭代。复杂度仍然是O(log(n))

你可以在这里试试https://onlinegdb.com/rkI5gn3Xd


感谢 chqrlie 提示我给出更详细的答案

【讨论】:

  • 你是个好推销员:33% 折扣!你支付大约一半的价格:)
  • @chqrlie haha​​hahha 不是真的。你是对的,但我的回答并不准确:)
【解决方案2】:

上述代码的复杂度应该是 O(log3n) 即...logn base 3。因为在 while 循环中,rmid 的值总是大于lmid。所以,对于给定的 right 值,即..n,left 的值将减小每次迭代时 1/3 的倍数。

【讨论】:

  • O(log3(n)) 与 O(log2(n)) 或 O(Log(n)) 相同,这些不同的对数仅相差一个常数因子。此外,循环仅将跨度减少 1/3,迭代次数为log(right - left) / log(3/2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多