如何解决查找在循环中执行 k += sqrt(k) 的时间复杂度
鉴于此代码:
int f(int n)
{
int j = 10;
while( j < n) {
j += sqrt(j);
printf("Hello\n");
}
return j;
}
我如何找到它的时间复杂度,解决方案是 O(sqrt(n))
但仍然是为什么?
感谢您的时间
我发现变量 j
属于序列 u
n+1=un+sqrt(un),试图找到它的通用术语并没有把我带到任何地方,我也试过为它使用生成函数,但仍然没有用。
解决方法
显然,计算 k + 1
的第 j
个值可以表示为函数 f(k + 1)
:
然后,可以使用Taylor series通过f(k + 1)
近似f(k)
:
所以,将(2)代入(1)
现在,一旦 f(k)
达到 n
,步数计算如上,对于这个近似值,时间复杂度为 O(sqrt(n))
。
现在,让我们通过 k 表示 fk:
那么,一个错误有多严重?请注意,下面使用的 f(k+1)
和 f(k)
是 f(k+1)
和 f(k)
的近似值(来自 (1)):
我们不希望误差依赖于 k
,因此我们将其旁边的系数设置为 0
。因此,C0=2.
所以,我们的近似误差是 0.25
.
顺便说一下,我们还可以找到一个剩余的系数C1。为此,我们可以使用初始值 f(0)=10
。所以,0 = 2 * sqrt(10) + C1 -> C1=-6.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。