编写并解决计算素数的算法的重复次数?

时间:2013-10-16 01:45:12

标签: math big-o computer-science recurrence

我正在学习考试,我遇到了这个问题,我在这个课程上并不太好,而且我完全被它考虑了。我真的很感激一些帮助!

  

假设您可以访问及时运行的算法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)   替换,猜测,通过归纳证明猜测,以及   最后根据你的猜测推断出一个封闭的。或者,你   可以使用重复替换来猜测封闭形式,并证明你的   封闭形式通过归纳正确。

非常感谢,我真的很感激任何帮助!

2 个答案:

答案 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 );我会把细节留给你。

希望这有帮助!