gpt4 book ai didi

math - 设置和解决递归函数的递归关系?

转载 作者:行者123 更新时间:2023-12-05 01:19:03 24 4
gpt4 key购买 nike

我正在学习 java 循环,但被困在以下问题上。

void f(int n) {
if (n<=1) return;
f(n/2);
System.out.writeln("still continuing...");
f(n/2);
f(n/2);
}

我有两个问题。

  1. 如果我们说 T(n) 是程序打印的行数,n 是输入,那么 T(n) 的递推公式是什么?

  2. 如何在不使用主定理的情况下解决问题 1 的递推式?

干杯

最佳答案

让我们从计算 T(n) 值的公式开始。我们知道以下内容:

  1. 以 0 或 1 作为参数调用 f 需要时间 O(1)
  2. 用较大的值调用 f 会调用 f(n/2) 三次,并执行恒定数量的其他工作。

因此,我们可以得到如下重现:

  • T(1) ≤ 1
  • T(n) ≤ 3T(n/2) + 1

请注意,我在这里使用的是“+ 1”而不是“+ O(1)”。这在数学上是有问题的,但由于我们正在寻找以大 O 表示法表示的最终结果,所以这不会成为太大的问题。

现在,我们将如何尝试解决这个问题?一种选择是为 n 插入一些任意值,然后看看会发生什么。我们从(假设 n > 1)开始

T(n) ≤ 3T(n / 2) + 1

现在,让我们考虑一下对 T(n/2) 的那些调用。如果 n/2 > 1,那么我们就得到了

T(n) ≤ 3T(n / 2) + 1

≤ 3(3T(n / 4) + 1) + 1

= 9T(n / 4) + 3 + 1

现在,让我们将其扩展为一个增益:

T(n) ≤ 9T(n / 4) + 3 + 1

≤ 9(3T(n / 8) + 3) + 3 + 1

= 27T(n / 8) + 9 + 3 + 1

此时,我们可以看到一种模式正在出现。经过 i 次递归迭代后,我们得到完成的总工作量是

T(n) = 3iT(n / 2i) + sum(i = 0 to i - 1)3i

当 n/2i ≤ 1 时,此过程终止,这发生在 i ≈ lg n 时。如果我们插入 lg n,我们得到

T(n) ≤ 3lg nT(1) + sum(i = 0 to i - 1)3i)

≤ 3lg n + sum(i = 0 to i - 1)3lg n

现在,3lg n = 3(log3 n/log3 2) = 3log3 n1/log3 2 = n1/log3 2,所以这整件事是

T(n) ≤ n1 / log3 2 + sum(i = 0 to (lg n) - 1)3i

使用几何级数和的公式,最后一项是 (3lg n - 1)/2,最终扩展为 O(n1/log3 2), 所以总的来说这个表达式是 O(n1/log3 2).

但是这个公式真的很难看。我们可以简化它吗?好吧,我们确实有这个:

1 / log3 2 = log2 3

这让我们知道运行时间是 O(nlg 3),大约是 O(n1.58)。

希望这对您有所帮助!

关于math - 设置和解决递归函数的递归关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com