Performance 计算函数的运行时间

Performance 计算函数的运行时间,performance,scheme,big-o,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)

我无法计算调用其他函数的函数的运行时间。例如,下面是一个将二叉树转换为列表的函数:

(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*logn)

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

谢谢你的帮助。

考虑一下显然是二次型的O(n^2)。 现在考虑<代码> O(n ^ 2+n)< /代码>,这仍然是二次的,因此我们可以把它减少到<代码> O(n ^ 2)< /代码>,因为<代码> +n < /代码>不重要(它不改变“数量级”)(不确定这是正确的术语)。
这同样适用于这里,因此我们可以将
O([n*log(n)]+n)
减少到
O(n*log(n))
。但是,我们可能不会将其减少到
O(log(n))
,因为这将是对数的,而不是。

如果我理解正确,您是在询问
追加
cons
之间的区别

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

将其与
(附加xs ys)
进行比较。这里,
append
需要创建一个新列表,其中包含
xs
ys
中的元素。这意味着,如果
xs
n
元素的列表,那么
append
需要分配
n
新对来保存
xs
的元素

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

O(nlog(n)+n)=O(nlog(n))