计算函数的运行时间

时间:2015-09-30 15:53:31

标签: performance scheme big-o

我遇到调用其他函数的函数的运行时间有问题。例如,这是一个将二叉树转换为列表的函数:

(define (tree->list-1 tree)
  (if (null? tree)
  ’()
  (append (tree->list-1 (left-branch tree))
          (cons (entry tree)
          (tree->list-1 (right-branch tree))))))

解释是T(n)= 2 * T(n / 2)+ O(n / 2),因为程序追加需要线性时间。求解上述等式,我们得到T(n)= O(n * log n)。

然而,缺点也是一个结合了两个元素的过程。在这种情况下,它会通过所有入口节点,为什么我们不在解决方案中添加另一个O(n)?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

考虑O(n^2),这显然是二次的。 现在考虑O(n^2 + n),这仍然是二次的,因此我们可以将此值减少到O(n^2),因为+ n不重要(它不会改变“数量级”(不确定这是正确的术语))。

这同样适用于此,因此我们可以将O([n*log(n)] + n)缩减为O(n*log(n))。但是我们可能不会将其减少到O(log(n)),因为这将是对数,而不是。

答案 1 :(得分:1)

如果我理解正确,您就会问appendcons之间的区别。

(cons a b)使用的时间不依赖于ab的值。该调用分配一些内存,用类型标记(“pair”)标记它,并存储指向该对中的值a和b的指针。

将此与(append xs ys)进行比较。此处append需要制作列表,其中包含xsys中的元素。这意味着,如果xsn个元素的列表,则append需要分配n个新对来保存xs的元素。

简而言之:append需要复制xs中的元素,因此时间与xs的长度成正比。函数cons使用时间,无论调用什么参数。