最佳自平衡BST,可快速插入大量节点

时间:2008-08-05 15:40:25

标签: data-structures language-agnostic binary-search-tree

我已经能够通过几个来源找到几个自平衡BST的详细信息,但我没有找到任何好的描述,详细说明哪一个最适合在不同的情况下使用(或者如果真的没关系)。

我希望BST最适合存储超过一千万个节点。节点的插入顺序基本上是随机的,我永远不需要删除节点,因此插入时间是唯一需要优化的东西。

我打算用它来存储益智游戏中先前访问过的游戏状态,以便我可以快速检查是否已经遇到过以前的配置。

4 个答案:

答案 0 :(得分:4)

对于插入繁重的应用程序,

Red-black优于AVL。如果你预见相对统一的查找,那么红黑就是你要走的路。如果您预见到相对不平衡的查找,最近查看的元素更有可能再次被查看,您可以使用splay trees

答案 1 :(得分:3)

为什么要使用BST?从您的描述中,如果不是更好的话,字典也会起作用。

使用BST的唯一原因是,如果您想按密钥顺序列出容器的内容。这肯定听起来不像你想要这样做,在这种情况下去哈希表。 O(1)插入和搜索,不用担心删除,有什么可能更好?

答案 2 :(得分:0)

我最熟悉的两个自我平衡BST是红黑色和AVL,所以我不能肯定是否有任何其他解决方案更好,但我记得与AVL相比,红黑的插入速度更快,检索速度更慢。

因此,如果插入的优先级高于检索,则红黑可能是更好的解决方案。

答案 3 :(得分:-2)

  

[哈希表] O(1)插入和搜索

我认为这是错误的。

首先,如果将键空间限制为有限,则可以将元素存储在数组中并执行O(1)线性扫描。或者您可以对阵列进行混合,然后在O(1)预期时间内进行线性扫描。当东西有限时,东西很容易O(1)。

因此,假设您的哈希表将存储任意位字符串;只要有一组无限的键,每一个都是有限的,它就没那么重要了。然后你必须读取任何查询和插入输入的所有位,否则我在y1中插入y0并在y1上查询,其中y0和y1在你不看的单个位位置不同。

但是,让我们说密钥长度不是参数。如果您的插入和搜索采用O(1),特别是散列需要O(1)时间,这意味着您只能查看散列函数的有限数量的输出(从中可能 只有有限的输出,被授予。)

这意味着对于有限数量的桶,必须有一组无限的字符串,它们都具有相同的散列值。假设我插入了很多,即ω(1),并开始查询。这意味着您的哈希表必须依赖于其他一些O(1)插入/搜索机制来回答我的查询。哪一个,为什么不直接使用它?