Python 为什么此函数具有对数时间复杂度(计算数字的n次根)?
上周,我参加了一个关于计算机科学的专门的MOOC,教授使用了一种低效的方法来计算一个数字的平方根(他后来还展示了其他方法) 下面是一个用C++实现的函数:Python 为什么此函数具有对数时间复杂度(计算数字的n次根)?,python,c++,math,matplotlib,time-complexity,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 += s
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/步数的平方根)次
我决定使用matplotlib
绘制一个函数增长的曲线图,范围从1到199(包括1到199),结果如下:
然后,我将其与(log(x)/步骤
)图进行比较,结果如下:
因此,我有以下问题:
- 为什么是对数?为什么这不仅适用于平方根,而且适用于数字的任何n次根(使用上述方法)
sqrt
growth和log(x)之间的差距是什么
我知道有更有效的方法可以获得相同的数字平方根结果,但我需要有人对此有所了解。你说循环执行sqrt(num)
次是正确的,这就增加了它的复杂性√然而,与后面的假设相反,平方根不是对数的:它只是num^(1/2)
,这使得它在事物的大格局中是多项式
一个清晰的标志和视觉帮助是,它不是对数图上的直线:
左边的线是平方根,右边的线是以10为底的对数
这个差距显然是因为它不是对数的。信不信由你,你的函数'sqrt'增长
正是f(x)=sqrt(x)/step
图。我真的需要一些睡眠。我把它错当成对数了。。谢谢你把事情弄清楚。没关系,我也需要睡一会儿:)