【问题标题】:Best self-balancing BST for quick insertion of a large number of nodes用于快速插入大量节点的最佳自平衡 BST
【发布时间】:2008-08-05 15:40:24
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Red-black 比 AVL 更适合插入繁重的应用程序。如果您预见到相对统一的查找,那么红黑是要走的路。如果您预见到相对不平衡的查找,即最近查看的元素更有可能再次被查看,您希望使用splay trees

    【讨论】:

      【解决方案2】:

      为什么要使用BST?根据您的描述,如果不是更好的话,字典也可以正常工作。

      使用BST 的唯一原因是如果您想按键顺序列出容器的内容。听起来您当然不想这样做,在这种情况下,请使用哈希表。 O(1)插入搜索,不用担心删除,还有什么更好的呢?

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          我认为这是错误的。

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

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

          但是假设密钥长度不是参数。如果您的插入和搜索花费 O(1),尤其是散列需要 O(1) 时间,这意味着您只能查看来自散列函数的有限输出(其中可能成为 只有一个有限的输出,授予)。

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

          【讨论】:

          • 这是传统的智慧。最好的情况,O(1),显然实现会有所不同。还有各种不同的哈希表算法。
          • “这是传统智慧。” ——我听过很多次了,但我还没有看到证据。如果您想要理论结果“它是 O(1)”,我认为挑战这个民间传说会很好,或者如果您想要“在实践中快速”,可以测量各种查找结构。 “最好的情况,O(1)”——不平衡的搜索树也有,但没有人认为它们有“O(1) 的插入和搜索”。
          • 最好的不平衡搜索树将是平衡的一个节点。最佳情况插入/查找仍然是 log(n)
          • 在最好的情况下,用户正在搜索存储在根节点的值,这需要 O(1) 时间来访问...
          • @MeNoMore Jonas 正确在他的答案的第一行使用了引用格式,因为它是别人的引用。以后不要进行这样的修改。
          猜你喜欢
          • 1970-01-01
          • 2017-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          相关资源
          最近更新 更多