我刚刚完成了面试,我正在努力解决这个问题,在我看来这是一个非常难以接受15分钟面试的问题。
问题是: 编写一个函数,它给出一个整数流(无序),构建一个平衡的搜索树。 现在,您不能等待输入结束(它是一个流),因此您需要动态平衡树。
我的第一个答案是使用红黑树,这当然可以完成这项工作,但我不得不假设他们没想到我会在15分钟内实施一棵红黑树。
那么,对于我不知道的这个问题,有没有简单的解决方案?
谢谢,
戴夫
答案 0 :(得分:9)
我个人认为,最好的方法是使用像 treap 这样的随机二叉搜索树。这并不能绝对保证树的平衡,但很有可能树会有很好的平衡因子。 treap通过用均匀随机数增加树的每个元素来工作,然后确保树是关于键的二元搜索树和关于均匀随机值的堆。插入treap非常容易:
最后一步是唯一非常难的,但如果你有时间在白板上解决这个问题,我很确定你可以在面试中即时实现这一点。
可能有效的另一个选择是使用 splay tree 。它是另一种快速BST,可以在假设您具有标准BST插入功能和树旋转功能的情况下实现。重要的是,splay树在实践中非常快,并且已知它们(在一个常数因子内)至少与任何其他静态二叉搜索树一样好。
根据“搜索树”的含义,您还可以考虑将整数存储在一些优化的结构中,以便查找整数。例如,您可以使用 bitwise trie 来存储整数,这些整数支持与机器字中的位数成比例的时间查找。这可以很好地使用递归函数来查看位,并且不需要任何类型的旋转。如果你需要在十五分钟内完成一个实现,如果面试官允许你偏离标准的二元搜索树,那么这可能是一个很好的解决方案。
希望这有帮助!
答案 1 :(得分:3)
AA Trees比红黑树更简单,但我无法实现一个。
答案 2 :(得分:1)
最简单的平衡二叉搜索树之一是BB(α)树。你选择常数α,它表示树可以得到多少不平衡。在任何时候,#descendants(child) <= (1-α) × #descendants(node)
都必须保留。您将其视为普通二进制搜索树,但当公式不再适用于某个节点时,您只需从头开始重建该部分树,以使其完美平衡。
插入或删除的摊销时间复杂度仍为O(log N),与其他平衡二叉树一样。