我正在努力教自己的计划,而我最挣扎的概念是空间和时间的复杂性。我在本章末尾做了一些练习,但我无法弄清楚以下两点。我试图找出每个函数的渐近时间复杂度(紧束缚)。
;; Finds the largest number below 1000000000 which is divisible by both 3 and 5.
(define (largest-div-3-or-5)
(define (div-3-and-5? n)
(and (= (remainder n 3) 0) (= (remainder n 5) 0)))
(define (iter n r)
(cond ((= n 1000000000) r)
((div-3-and-5? n) (iter (+ n 1) n))
(else (iter (+ n 1) r))))
(iter 1 0))
为此,我认为渐近时间复杂度为O(n),因为除非满足停止条件,否则每次调用迭代函数一次。
第二个功能由:
给出(define (sum-of-cubes-2-different-ways max-n)
(define (cube n) (* n n n))
(define (iter n1 n2 n3 n4 results)
(cond ((> n1 max-n) results)
((> n2 max-n) (iter (+ n1 1) 1 1 1 results))
((> n3 max-n) (iter n1 (+ n2 1) 1 1 results))
((> n4 max-n) (iter n1 n2 (+ n3 1) 1 results))
; make sure n1,n2 are distinct from n3,n4:
((or (= n1 n3) (= n1 n4) (= n2 n3) (= n2 n4))
(iter n1 n2 n3 (+ n4 1) results))
((= (+ (cube n1) (cube n2)) (+ (cube n3) (cube n4)))
(iter n1 n2 n3 (+ n4 1) (cons (list n1 n2 n3 n4) results)))
(else (iter n1 n2 n3 (+ n4 1) results))))
(iter 1 1 1 1 (list)))
在我看来,这是O(n ^ 2)。很难解释为什么我这么认为我真的只是在眼睛。
答案 0 :(得分:1)
第一个时间复杂度为O(n),因为您在列表中每个元素执行一定数量的操作。
第二个时间复杂度为O(n ^ 4)。您正在迭代从范围[0,n]中拾取的4个整数的每个可能组合。第一个数字有n个选择,第二个数字有n个选择,第三个数字有n个选择,第四个数字有n个选择。因此,这四个数字有n ^ 4个可能的组合,并且每个组合执行一定数量的操作,这意味着整体复杂度为O(n ^ 4)。