空间与时间的方案代码分析

时间:2010-09-25 08:42:27

标签: lisp scheme code-analysis complexity-theory

我正在通过麻省理工学院在线课程中的经典6.001课程:计算机程序的结构和解释。

我正在努力了解在内存使用情况与执行时间方面分析代码复杂性。在前几个讲座中,他们提出了Fibonacci系列方案的解决方案。

他们在视频中呈现的解决方案是具有x(线性递归性能)在内存空间中增长的特性,这对Fibonacci系列来说是个大问题。当您尝试找到更大的Fibonacci数时,递归所需的空间变得非常大。

他们建议尝试找到获得线性迭代性能的方法,其中所需的内存空间在整个计算过程中保持不变,并且不依赖于x。

我的解决方案如下。我的具体问题是,在内存使用情况与执行时间方面,我的Scheme代码的性能分析是什么?

(define (fib x)

  (define (fib-helper target total current-index i-2 i-1)
     (if (> current-index target)
            (if (= target 1)
                0
                total)
            (fib-helper target
                        (+ i-2 i-1)
                        (+ current-index 1)
                        i-1
                        (+ i-2 i-1))))

  (fib-helper x 1 3 0 1))

2 个答案:

答案 0 :(得分:2)

好吧,考虑到(fib n)导致n-1调用fib-helper,您的解决方案将以线性时间运行。 fib-helper每次迭代只调用一次,每次迭代都是尾调用,因此你的程序在恒定的空间内运行。

这意味着对(fib 1000)的调用只占用(fib 100)的CPU时间的十倍,同时占用相同的内存量。

答案 1 :(得分:1)

看到你对fib-helper的调用是一个正确的尾调用,它将在恒定的空间内运行。

我无法帮助你执行时间:)