【发布时间】:2018-01-31 16:42:30
【问题描述】:
我看到了一个很短的算法来合并两个二叉搜索树。我很惊讶它是多么容易而且效率很低。但是当我试图猜测它的时间复杂度时,我失败了。
让我们有两个包含整数的不可变二叉搜索树(不平衡),并且您希望将它们与伪代码中的以下递归算法合并在一起。函数insert为辅助:
function insert(Tree t, int elem) returns Tree:
if elem < t.elem:
return new Tree(t.elem, insert(t.leftSubtree, elem), t.rightSubtree)
elseif elem > t.elem:
return new Tree(t.elem, t.leftSubtree, insert(t.rightSubtree, elem))
else
return t
function merge(Tree t1, Tree t2) returns Tree:
if t1 or t2 is Empty:
return chooseNonEmpty(t1, t2)
else
return insert(merge(merge(t1.leftSubtree, t1.rightSubtree), t2), t1.elem)
我猜它是一个指数算法,但我找不到它的论据。这个合并算法最差的时间复杂度是多少?
【问题讨论】:
-
为什么说算法无效?
-
@displayName 将一棵树插入另一棵树将是 O(n^3)。但这可能就像 O(n^n),因为对于每个节点,它会再次遍历整个树到底部。然后再一次(第二次合并)......
-
@greybeard 是的,“低效”是一个更好的词,我改了标题。我在“可用于有用的工作”的含义内使用“有效”一词,而不是作为可计算性理论的术语。
标签: algorithm merge time-complexity binary-search-tree asymptotic-complexity