微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找在循环中执行 k += sqrt(k) 的时间复杂度

如何解决查找在循环中执行 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)

enter image description here (1)

然后,可以使用Taylor series通过f(k + 1)近似f(k)

enter image description here (2)

所以,将(2)代入(1)

enter image description here

现在,一旦 f(k) 达到 n,步数计算如上,对于这个近似值,时间复杂度为 O(sqrt(n))

现在,让我们通过 k 表示 fk

enter image description here

那么,一个错误有多严重?请注意,下面使用的 f(k+1)f(k)f(k+1)f(k) 的近似值(来自 (1)):

enter image description here

我们不希望误差依赖于 k,因此我们将其旁边的系数设置为 0。因此,C0=2.

enter image description here

所以,我们的近似误差是 0.25 .

顺便说一下,我们还可以找到一个剩余的系数C1。为此,我们可以使用初始值 f(0)=10。所以,0 = 2 * sqrt(10) + C1 -> C1=-6.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。