- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想了解如何创建顺序(分支因子)为 3 且节点中的最大条目数为 3 的 B+ 树。我搜索了很多小程序,但大多数都不能正常工作,那个很棒的似乎没有遵循我在维基百科上找到的这些步骤。
按照这些步骤
我相信新值的插入应该发生在第 4 步之前。是否有更好描述的此算法版本?
将 20,15,5,1,3,9,2,12
作为输入,我获得了以下树:
|1|5| |
|2|5| | |9| | |
|1|2| | |3|5| | |9| | | |15|20| |
按照这些步骤正确吗?谁能指出一个小程序来验证这个例子?
最佳答案
你的树不正确。节点(不是叶子)中的每个值都应该是分支的断点。为了说明这一点,让我们考虑以下节点:
----------------------------------------
| 7 | 23 |
----------------------------------------
| pointer to | pointer to | pointer to |
| branch with| branch with| branch with|
| values | values | values |
| < 7 | 7 <= x < 23| >= 23 |
----------------------------------------
此节点有 2 个值和三个分支。值 7 和 23 表示第二个和第三个分支中的最小值。第一个分支的最小值不在此级别表示。 (除非它是整棵树中的最小值,否则它会在更高的层次上。)
b=4 时,插入值的规则可以总结为:
让我们考虑一棵数字为 1..9 的树:
3,5,7
|----------------|
1,2 3,4 5,6 7,8,9
如果我们现在将数字 10 插入树中,最右边的叶子会变得太满 (7,8,9,10),因此必须将其分成两片叶子 (1,8) 和 (9,10)。按照规则,数字 9(上拆分桶的最小值)被发送到父级:
3,5,7,9
|---------------------|
1,2 3,4 5,6 7,8 9,10
这使得父级满了,它必须被拆分:
3,5 7,9
|-------| |---|
1,2 3,4 5,6 7,8 9,10
当一个父节点 split 时,新节点的第一个值被发送给它的父节点。在这棵树中,新节点是 (7,9),因此要删除并发送给父节点的值为 7。由于没有这样的父节点,因此创建了新的根节点:
7
|---------|
3,5 9
|-------| |---|
1,2 3,4 5,6 7,8 9,10
让我们用数字 20,15,5,1,3,9,2,12 和 b = 4 构建一棵树
前三个值适合一个叶子(同时是根节点):
5,15,20
当插入数字1时,桶 split ,新桶的第一个值被发送给父(新根):
15
|-----|
1,5 15,20
应该注意的是,叶节点中没有任何内容被删除。删除仅发生在 split 的父节点中。
值 3 可以毫无问题地插入其桶中(桶将变为 1,3,5)。但是,尝试插入数字 9 会使桶装满 (1,3,5,9) 并且它会 split 。新桶 (5) 的第一个值将被插入到父桶中。
5,15
|----------|
1,3 5,9 15,20
值 2 和 12 在不 split 的情况下适合它们的桶,因此树是:
5,15
|--------------|
1,2,3 5,9,12 15,20
要了解当中间节点 split 时会发生什么,让我们考虑以下树:
26
|-----------------------------|
8,14,20 30,34
|--------------------------| |-----------|
2,4,6 8,10,12 14,16,18 20,22,24 26,28 30,32 34,36
现在我们将值 13 添加到树中。这将触发将桶 (8,10,12,13) 分成两部分:
26
|-----------------------------------|
8,12,14,20 30,34
|-------------------------------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
中左节点(8,12,14,20)的子节点太多,必须拆分:
26
|---------------------------------------|
8,12 14,20 30,34
|-------------| |---------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
当我们拆分父节点时,我们必须应用添加的规则,即新桶的第一项必须插入父节点并从节点中删除,即 14 从 (14,20) 中删除:
14,26
|------------------------------------|
8,12 20 30,34
|-------------| |---------| |-------------|
2,4,6 8,10 12,13 14,16,18 20,22,24 26,28 30,32 34,36
这棵树也用来说明这个规则:每个父节点携带除第一个子树之外的每个子树的最低值。
题目中的例子应该是这样的(如果我没有犯太多错误的话):
5
|----------|
3 15
|---| |-------|
1,2 3 5,9,12 15,20
关于java - 如何创建 B+ 树数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24437893/
我有两种结构,Header 和Session,它们都符合协议(protocol)TimelineItem。 我有一个 Array 由 TimelineItem 组成,如下所示: [Header1, S
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 6 年前。 我刚接触python所以想问你
我试图找到一种方法来在 R 中获取 A、A、A、A、B、B、B、B、B 的所有可能的唯一排列的列表。 组合最初被认为是获得解决方案的方法,因此组合的答案。 最佳答案 我认为这就是你所追求的。 @bil
我怎样才能将两个给定的向量混合成一个新的向量,它以交替的顺序保存它们的值。 (f [a a] [b b]) ; > [a b a b] 这是我想到的: (flatten (map vector [:a
这是我的第一个问题,我开始学习Python。之间有区别吗: a, b = b, a + b 和 a = b b = a + b 当您在下面的示例中编写它时,它会显示不同的结果。 def fib(n):
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 12 个月前关闭。 我不知道如何解释: namespace A { struct
我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。 这是我尝试过的两个交换函数: package lang.numeric; public class SwapVars
假设类 B 扩展类 A,并且我想为 B 声明一个变量。什么更有效?为什么? B b或 A b . 最佳答案 您混淆了两个不同的概念。 class B extends A { } 意味着B 是 A .
我不确定这个问题的标题是什么,这也可能是一个重复的问题。所以请相应地指导。 我是 python 编程的新手。我有这个简单的代码来生成斐波那契数列。 1: def fibo(n): 2: a =
我在谷歌上搜索了有关 dynamic_cast 的内容,我发现显式地将基类对象转换为派生类指针可能是不安全的。但是当我运行一些示例代码来检查它时,我没有收到任何错误。请在下面找到我的代码: class
这个问题在这里已经有了答案: What is this weird colon-member (" : ") syntax in the constructor? (14 个答案) 关闭 8 年前。
在不重现产生非整数值的表达式的情况下实现以下目标的惯用方法是什么(在我的真实情况下,该值是在我不想重现的冗长查询之后计算为百分比的): SELECT * FROM SomeTable WHERE 1/
在析构中,这两个代码的结果确实不同。我不确定为什么。 提示说 const [b,a] = [a,b] 将导致 a,b 的值为 undefined (从左到右的简单分配规则)。我不明白为什么会这样。 l
C++ Templates - The Complete Guide, 2nd Edition介绍max模板: template T max (T a, T b) { // if b < a th
我最近开始学习代码(Java),并根据第 15.17.3 节在 Oracle 网站上查找了模运算符。以下链接: http://docs.oracle.com/javase/specs/jls/se8/
无法理解以下行为。 d1 := &data{1}; 的区别d1 和 d2 := 数据{1}; &d1。两者都是指针,对吧?但他们的行为不同。这里发生了什么 package main import "f
这个问题在这里已经有了答案: How to make loop infinite with "x = y && x != y"? (4 个回答) How can i define variables
在我的程序中,当我调试我的代码时,它似乎在我生成的代码中的某处 X1=['[a,a,a]','[b,b,b]'] 还有我生成的其他地方 X2=[[a,a,a],[b,b,b]] 当我想添加这两个列表然
我试图使用递归将两个整数相乘,并意外编写了这段代码: //the original version int multiply(int a, int b) { if ( !b ) retu
我有一个列表中数字之间所有可能的操作组合: list = ['2','7','8'] 7+8*2 8+7*2 2*8+7 2+8*7 2-8*7 8-2/7 etc 我想知道是否可以说像 ('7*2+
我是一名优秀的程序员,十分优秀!