Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm RRB树保持什么不变?_Algorithm_Scala_Data Structures_Clojure_Tree - Fatal编程技术网

Algorithm RRB树保持什么不变?

Algorithm RRB树保持什么不变?,algorithm,scala,data-structures,clojure,tree,Algorithm,Scala,Data Structures,Clojure,Tree,(RRB树)是不可变向量(在Clojure和Scala中使用)的推广,这些向量具有“有效恒定”的索引和更新时间。RRB树保持高效的索引和更新,但也允许高效的连接(logn) 作者以一种我觉得难以理解的方式呈现数据结构。我不太确定每个节点维护的不变量是什么 在第2.5节中,他们描述了他们的算法。我认为他们正在确保索引到节点只需要在基数搜索之后再执行额外的线性搜索步骤。我不明白他们是如何推导出额外步骤的公式的,我想也许我不确定每个变量的含义(特别是“总共p个子树分支”) RRB树连接算法是如何工作的

(RRB树)是不可变向量(在Clojure和Scala中使用)的推广,这些向量具有“有效恒定”的索引和更新时间。RRB树保持高效的索引和更新,但也允许高效的连接(logn)

作者以一种我觉得难以理解的方式呈现数据结构。我不太确定每个节点维护的不变量是什么

在第2.5节中,他们描述了他们的算法。我认为他们正在确保索引到节点只需要在基数搜索之后再执行额外的线性搜索步骤。我不明白他们是如何推导出额外步骤的公式的,我想也许我不确定每个变量的含义(特别是“总共p个子树分支”)


RRB树连接算法是如何工作的?

他们在第2.4节中描述了一个不变量“但是,如前所述 B-树节点不便于基数搜索。相反,我们选择了 允许节点大小在
m
m-1
。这定义了一个以 著名的2-3棵树、3-4棵树和(对于m=32)31-32棵树。这 不变量确保了平衡,并在 大多数情况下。偶尔需要几步线性搜索 在基数搜索之后,找到正确的分支。 所需的额外步骤在更高级别上增加。”


看看他们的公式,看起来他们已经计算出了子树中存储的最大和最小可能值的数量。两者之间的差异是点下方最大值和最小值之间可能存在的最大差异。如果将其除以插槽下的值数,则在计算出要查看哪个插槽以查看其是否包含正在搜索的索引时,可以关闭的最大插槽数。

@mcdowella是正确的,这就是他们所说的松弛节点。但是,如果要拆分和连接节点,从m到m-1的范围意味着您有时需要调整多达m-1(m-2?)个节点,以便从节点中添加或删除单个元素。这似乎效率极低。我认为它们的意思是在m和(2m)-1之间,因为这允许当节点太大时将节点拆分为2个,或者当节点太小时将2个节点合并为一个,而不需要更改第三个节点。所以这是一个打字错误,论文中“2m”中缺少了“2”。在这件事上支持我

此外,所有严格节点的长度必须是2的幂。原因是Rich Hickey的Clojure PersistentVector中进行了优化。好吧,我认为重要的是打包剩下的所有严格节点(稍后将详细介绍),这样您就不必猜测树的哪个分支要下降。但是,能够进行位移位和位掩码而不是分割是一个很好的奖励。我没有对松弛的Scala向量执行get()操作,但是。因此,它尽一切努力做到尽可能严格,如果重复在0处插入,甚至会产生2个严格级别

它们的树也有一个均匀的高度——所有叶节点与根的距离相等。我认为,如果放松的树木必须在,比如说,一层一层的范围内,这仍然有效,尽管不确定这会给你带来什么

松弛节点可以有严格的子节点,但反之亦然

严格的节点必须从左侧(低索引)填充,没有间隙。任何非完全严格节点必须位于树的右侧(高索引)边缘。如果您在焦点或尾部添加了附加项,则所有严格的叶节点都可以始终处于满状态(下面将详细介绍)


通过在中搜索debugValidate()方法,可以看到大多数不变量。这不是他们的论文,但主要是基于它。实际上,文件中的“显示”变量也没有提到。如果你要研究这些东西,你可能想先好好看看Clojure,因为RRB树里面有一个。它与RRB树之间的两个区别是1。RRB树允许“松弛”节点和2。RRB树可能有一个“焦点”而不是“尾巴”。焦点和尾巴都是小缓冲区(可能与严格的叶节点大小相同),区别在于焦点可能会定位到向量最后插入/附加到的任何区域,而尾巴总是在末尾(PerSistentVector只能追加到,不能插入到)。这两个差异允许O(logn)任意插入和删除,加上O(logn)split()和join()操作。

我的理解是,这是他们选择作为垫脚石的初始算法。第2.5节说,他们使用的是一种约束较少的方法。我想也许我应该尝试通过计算存储值的最大和最小数量来推导他们的公式,就像你说的。我发现他们的表述令人困惑的一点是,这不可能对于每一个节点来说,对于所有向量大小,都可以是m或度数(M-1)。考虑例如M=8和长度为80的向量。我假设右脊椎允许任意的程度,但是如果他们说在纸上我错过了它。“贝尼维斯克问RRB矢量的右脊椎是否允许有任意的度数。两年后:-)这里有一个答案。是:RRB树的所有节点都应该包含(m-e)到m个子节点,其中e是允许的伸缩因子-树的最右边的脊椎除外,它可以安全地包含少于m-e子节点。(对于32路向量,e=2是一个不错的选择)。巴格韦尔和罗姆夫在他们的论文中没有提到这一点,但让·尼古拉斯·奥兰治在他的论文中确实提到了这一点。