这个Scheme求幂函数的时间复杂度是多少?

时间:2008-10-30 09:10:18

标签: algorithm math scheme time-complexity

时间复杂度是多少?为什么呢?

(define (mult a b)
      (define (internal a accum)
        (if (= a 1) accum
            (internal (- a 1) (+ accum b))))
      (internal a b))

(define (to-the-power-of m n)
  (define (internal x accum)
    (if (= x 0) accum
        (internal (- x 1) (mult accum m))))
  (internal n 1))

2 个答案:

答案 0 :(得分:3)

多部分的时间复杂度可以这样找到:

计算(mult a b),(内部一个accum)被调用,直到a = 1 所以我们有一种尾递归(循环)迭代a。

我们因此知道(mult a b)的时间复杂度 O(a)(=线性时间复杂度)

(对于m n的幂)也有一个(内部x accum)定义,它也循环(直到x = 0)

所以我们再次 O(x)(=线性时间复杂度)

但是:我们没有考虑内部函数调用所需的时间...
在内部,我们使用(mult a b)定义,该定义在时间复杂度上是线性的,因此我们有以下情况: 在第一次迭代中,调用mult:(mult 1 m) - > O(1)
第二次迭代变为:(mult m m) - > O(M)
第三次迭代:(multm²m) - > O(M * M) 等等 很明显,这种情况一直持续到n = 0(或者在内部,这变成x = 0)

因此我们可以说时间复杂度将取决于m和n: O(m ^ n)

[编辑:]您还可以查看我之前提到的相关问题:Big O, how do you calculate/approximate it?这可能会让您了解如何更一般地处理近似值

答案 1 :(得分:0)

假设加法和乘法都被计为单个运算,则此函数执行O(m ^ n)运算。

首先考虑mult功能。它(mult a b)将完全执行a-1次添加。因为渐近增长是相同的,所以为了数学简单,我们将其近似为a。

现在,对于power-power-of函数,这将执行对mult函数的n次调用。这些调用是(mult 1 m),yield m,然后是(mult m m),产生m ^ 2,然后是(mult m ^ 2 m),产生m ^ 3,依此类推到m ^ n。所以这里执行的操作总数是和m ^ 0 + m ^ 1 + ... + m ^ n。这是(m ^ n - 1)/(m-1),其增长为m ^ n。