我正在学习考试,我遇到了这个问题,我在这个课程上并不太好,而且我完全被它考虑了。我真的很感激一些帮助!
假设您可以访问及时运行的算法isprime(n) O(n)(比如说,蛮力检查所有数字的可分性 比n)。以下代码计算小于的素数 或等于其输入参数。
boolean numprimes(int n) { if (n == 1) { return 0; } else if (isprime(n)) { return numprimes(n − 1) + 1; } else { return numprimes(n − 1); } }
目标是分析num primes的运行时间。通过实现这一目标 执行以下操作:
(a)为T(n)写一个递归定义的运行时间 算法在大小为n的实例上。
(b)解决递归定义 使用重复的方法获得封闭形式的T(n) 替换,猜测,通过归纳证明猜测,以及 最后根据你的猜测推断出一个封闭的。或者,你 可以使用重复替换来猜测封闭形式,并证明你的 封闭形式通过归纳正确。
非常感谢,我真的很感激任何帮助!
答案 0 :(得分:1)
a)由于素数测试是在O(n)时间内进行的,因此复发将是
T(n) = T(n-1) + O(n)
b)随着部分a的解决,其余的应该很容易。如果你告诉我你为解决这个问题所做的工作,我可以帮助你更多。
答案 1 :(得分:1)
作为提示,这是复发的样子:
T(1)= 1
T(n)= T(n-1)+ O(n)
这是因为总是有一个递归调用(在大小为n - 1
的输入上),并且每个单独的调用都会使O(n)工作。
如果您将其重写为
T(1)≤1
T(n)≤T(n - 1)+ kn
你可以开始迭代。作为提示,最终结果应为O(n 2 );我会把细节留给你。
希望这有帮助!