Data structures 用于快速插入大量节点的最佳自平衡BST

Data structures 用于快速插入大量节点的最佳自平衡BST,data-structures,language-agnostic,binary-search-tree,Data Structures,Language Agnostic,Binary Search Tree,我已经能够通过多个来源找到关于几个自平衡BSTs的详细信息,但是我没有找到任何好的描述,详细说明在不同情况下(或者如果它真的不重要的话)哪一个是最好的 我想要一个BST,它最适合存储超过1000万个节点。节点的插入顺序基本上是随机的,我永远不需要删除节点,所以插入时间是唯一需要优化的 我打算用它在益智游戏中存储以前访问过的游戏状态,以便快速检查以前的配置是否已经遇到。我最熟悉的两个自平衡BST是红黑和AVL,因此我不能肯定是否有其他更好的解决方案,但我记得,与AVL相比,红黑具有更快的插入速度和

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

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


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

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


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

对于插入量大的应用程序,红黑可能比AVL更好。如果你预见到相对统一的查找,那么红-黑是最好的选择。如果您预见到一个相对不平衡的查找,最近查看的元素更有可能再次被查看,那么您需要使用。

为什么要使用
BST
?根据你的描述,一本词典即使不是更好,也同样适用

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

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

我认为这是错误的

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

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

但假设键长度不是一个参数。如果插入和搜索需要O(1),特别是散列需要O(1)时间,这意味着您只能查看散列函数的有限量输出(当然,可能只有有限的输出)


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

这是传统的智慧。最好的情况是O(1),显然实现会有所不同。还有各种不同的哈希表算法。“这是一种传统的智慧。”——我听过很多次,但我仍然没有看到证据。我认为,如果你想得到理论结果“它是O(1)”,或者如果你想“实践中快速”的话,测量各种查找结构,那么挑战这一民间传说将是一件好事。“最佳情况,O(1)”--不平衡搜索树也有,但没有人认为它们有“O(1)插入和搜索”。最佳情况不平衡搜索树将是平衡搜索树的一个节点。最佳案例插入/查找仍然是log(n)在最佳案例中,用户正在搜索存储在根节点上的值,这需要O(1)个时间来访问…@MeNoMore Jonas正确地使用了引号格式作为其答案的第一行,因为这是其他人的引号。以后不要这样编辑。