【问题标题】:How to find the complexity of while loop and recursive algorithms?如何找到while循环和递归算法的复杂度?
【发布时间】:2021-07-21 00:21:29
【问题描述】:

我正在尝试确定给定算法的复杂性如何随 N 增长。

1.
float epsilon = 0.001;
int a = 0;
int b = N - 1;
while (b - a > epsilon)
{
    int m = (int)((b + a) / 2);
    if (arr[m] > 0)
        b = m;
    else
        a = m;
}

2.
void f(int n)
{
    if (n == 0)
        printf("Hello\n");
    else
    {
        f(n - 1);
        f(n - 1);
    }
}
f(N);

对于第一个,我认为是 o(n) = N ,但我不确定。

有人能解释一下如何计算第一个和第二个算法的复杂度吗?

【问题讨论】:

  • 第一个:最坏情况的 O(∞)(例如,N = 2, arr[] = {0, 0}
  • 忽略边缘情况,应该分别是O(logN)O(2^N)
  • 您能解释一下,您是如何找到答案的吗?

标签: c algorithm recursion while-loop time-complexity


【解决方案1】:

第一个算法:

正如所写,abints 而不是 floats 毫无意义,我假设是后者。还有N,而不是N-1

观察到,在每次迭代中,ab 之间的距离减半,只要它超过 epsilon。因此迭代次数为ceiling(lg(N/epsilon)),即从N 减少到小于epsilon 所需的时间。

【讨论】:

  • 谢谢,知道了。但是第二种算法呢?也许我应该把 f(1),f(2),f(3) 然后推导出复杂度?
  • @Jordan:用n=4模拟手动执行。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多