我遇到调用其他函数的函数的运行时间有问题。例如,这是一个将二叉树转换为列表的函数:
(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)?
感谢您的帮助。
答案 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)
如果我理解正确,您就会问append
和cons
之间的区别。
(cons a b)
使用的时间不依赖于a
和b
的值。该调用分配一些内存,用类型标记(“pair”)标记它,并存储指向该对中的值a和b的指针。
将此与(append xs ys)
进行比较。此处append
需要制作新列表,其中包含xs
和ys
中的元素。这意味着,如果xs
是n
个元素的列表,则append
需要分配n
个新对来保存xs
的元素。
简而言之:append
需要复制xs
中的元素,因此时间与xs
的长度成正比。函数cons
使用时间,无论调用什么参数。