假设n是正整数,则复合函数执行如下:
(define (composite? n)
(define (iter i)
(cond ((= i n) #f)
((= (remainder n i) 0) #t)
(else (iter (+ i 1)))))
(iter 2))
在我看来,这里的时间复杂度(紧束缚)是O(n)或相当大的theta(n)。我现在正在关注它。因为我们每次循环时都会在iter的参数中加1,所以它似乎是O(n)。有更好的解释吗?
答案 0 :(得分:1)
不同的人会根据他们的假设以及他们对问题的影响而给出不同的答案。
假设您在每个循环中执行的相等和余数运算为O(1),则为O(n)。确实,处理器在O(1)中执行这些操作,但这仅适用于固定精度数字。由于我们正在谈论渐近复杂性,并且因为“渐近”,根据定义,处理事物无限制地增长时会发生什么,我们需要考虑任意大的数字。 (如果问题中的数字是有界的,那么算法的运行时间也会有限,因此整个算法在技术上都是O(1),显然不是你想要的。)
对于任意精度数,我会说等式和余数通常需要时间与数字的大小成比例,即log n。 (除非你能以某种方式在摊销分析中对其进行优化)因此,如果我们考虑到这一点,算法将是O(n log n)。有些人可能认为这是挑剔的
答案 1 :(得分:1)
写入的函数是O(n)。但是如果你将测试(= i n)改为(< n(* i i)),时间复杂度会下降到O(sqrt(n)),这是一个相当大的改进;如果n是一百万,那么时间复杂度从一百万降到一千。该测试有效,因为如果n = pq,p和q中的一个必须小于n的平方根,而另一个大于n的平方根;因此,如果没有找到小于n的平方根的因子,则n不能是复合的。 Newacct的答案正确地表明,如果n很大,算术的成本很重要,但算术的成本是log log n,而不是newacct建议的log n。