为什么这个函数具有对数时间复杂度(计算数字的第n个根)?

时间:2016-04-09 05:08:27

标签: python c++ math matplotlib time-complexity

上周,我正在接受一个关于计算机科学和教授的特定MOOC。使用了一种低效的方法来计算数字的平方根(他后来也展示了其他方法)。

这是用C ++实现的函数:

double sqrt(double num)
{
    double eps = 0.001;
    double step = 0.001;

    double result = 0.0;

    while (num - (result * result) > eps)
    {
        result += step;
    }

    return result;
}

我知道while循环将被执行(num / step的平方根)次。

我决定用matplotlib绘制一个从1到199(含)的数字范围内的函数增长图,结果如下:

result

然后,我将它与(log(x)/ step)绘图进行比较,再次结果如下:

result

所以,我有以下问题:

  • 为什么它是对数的?为什么这适用于数字的任何第n个根(使用上述方法)不仅仅是平方根?
  • sqrt增长与log(x)之间的差距是什么?

我知道有更有效的方法可以达到数字平方根的相同结果,但我需要有人对这个结果有所了解。

1 个答案:

答案 0 :(得分:3)

当你说循环执行sqrt(num)次时,你是正确的,这使得它的复杂性√num。然而,与后面的假设相反,平方根不是对数的:它只是num^(1/2),这使得它在宏观方案中成为多项式。

一个明确的标志和视觉帮助是它在对数图上不是直线:

enter image description here

左边的线是平方根,右边的线是10的对数。

显然,差距是因为它不是对数的。