目录
B-tree 的定义
参考维基百科《B-tree》的定义。一个度(order、degree)为 m 的 B-tree,其特点为:
- 每个节点最多有 m 个 children。
- 每个内部节点至少有 ⌈m/2⌉ 个 children(rounded up)。
- root 节点至少有两个 children,除非是个叶子节点。
- 所有的叶子节点都在同一层。
- 一个非叶子节点,如果有 k 个 children,则有 k-1 个 keys。
B-tree中,所有的数据分布在所有节点中(这个是与 B+ 树的区别之一)。
开箱即用的 btree 库
btree 是 google 实现的 btree,开箱即用。
下面的程序中,定义了一个 32 度的 B-tree,其元素类型是 *bItem
,并且在通过 NewG
定义 B-tree 时,传入了一个 less 函数用来对元素进行排序。
import (
"fmt"
"github.com/google/btree" //v1.1.2
)
type bItem struct {
value int64
}
func main() {
tree := btree.NewG(32, func(a, b *bItem) bool {
return a.value < b.value
})
f1 := bItem{value: 1}
f2 := bItem{value: 4}
f3 := bItem{value: 7}
tree.ReplaceOrInsert(&f1)
tree.ReplaceOrInsert(&f2)
tree.ReplaceOrInsert(&f3)
tree.AscendGreaterOrEqual(&bItem{value: 2}, func(item *bItem) bool {
fmt.Println(item.value)
return true
})
}
google 这个库提供的 api 有如下,我们可以直接使用:
- ReplaceOrInsert:替换或者插入元素,如果元素已经存在,而第二个返回值为 true。
- Delete:删除并返回一个元素,如果元素不存在,两个返回值分别为 zeroValue,以及 false。
- DeleteMin:删除并返回最小值,不存在则返回 false。
- DeleteMax:删除并返回最大值,不存在则返回 true。
- AscendRange(greaterOrEqual, lessThan T, iterator ItemIteratorG[T]):升序遍历
[greapterOrEqual, lessThan)
区间内的值。 - AscendLessThan(pivot T, iterator ItemIteratorG[T]):升序遍历区间
[first, privot)
区间内的值。 - AscendGreaterOrEqual(pivot T, iterator ItemIteratorG[T]):升序遍历区间
[pivot, last]
内的值,这个是个闭区间。 - Ascend:升序遍历所有值。
- DescendRange、DescendLessOrEqual、DescendGreaterThan、Descend:相应的降序遍历方法。
- Get/Min/Max/Has/Len:一些工具方法。
参考: