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))