我们一起再聊聊B-Tree的Golang实现

开发 前端
伪代码用了顺序查找的方法,即O(N)。从Part1可知,node中的元素是从小到大排列的,所以我们可以用二分的方式优化。

这是B-Tree合集的第二部分。在这一部分会实现基本的数据结构和Search。

基本数据结构

根据Part1介绍的B-Tree的属性,我们可以建立node和tree两个基本的数据结构

type BTreeNode struct {
keys []int // An array of keys
t int // Minimum degree
c []*BTreeNode // An array of child pointers
n int // Current number of keys
leaf bool // Is true when node is leaf. Otherwise false
}

type BTree struct {
root *BTreeNode // Pointer to root node
t int // Minimum degree
}

// Constructor for BTreeNode
func NewBTreeNode(t int, leaf bool) *BTreeNode {
return &BTreeNode{
keys: make([]int, t<<1-1),
t: t,
c: make([]*BTreeNode, t<<1),
leaf: leaf,
}
}

// Constructor (Initializes tree as empty)
func NewBTree(t int) *BTree {
return &BTree{
t: t,
}
}

Search

比如要在下面这个B树中找120

那么从Part1可知,我们都会从root出发,所以有下面3步即可找到120

可见,可以用下面的伪代码来描述Search方法

对于红框里面的,意思是找第一个大于等于k的键index,但是伪代码用了顺序查找的方法,即O(N)。从Part1可知,node中的元素是从小到大排列的,所以我们可以用二分的方式优化。

// find the index of the first key which is greater or equal to k
func findGE(s []int, left, right, k int) int {
if left <= right {
mid := left + (right-left)>>1

if k == s[mid] {
return mid
} else if k > s[mid] {
return findGE(s, mid+1, right, k)
} else {
return findGE(s, left, mid-1, k)
}
}

return left
}

下面是Search的代码

func (n *BTreeNode) search(k int) *BTreeNode {
i := findGE(n.keys, 0, n.n-1, k)

if n.keys[i] == k {
return n
}
if n.leaf {
return nil
}
return n.c[i].search(k)
}

func (t *BTree) Search(k int) *BTreeNode {
if t.root != nil {
return t.root.search(k)
}

return nil
}

在下次的Part3中,将实现B-Tree的Insert。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-01-26 00:59:39

B-Treegolang度量衡

2024-02-20 21:34:16

循环GolangGo

2022-06-09 21:57:19

TCPIP协议栈

2022-10-08 00:00:05

SQL机制结构

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷开发模式

2023-08-10 08:28:46

网络编程通信

2022-05-24 08:21:16

数据安全API

2023-09-10 21:42:31

2023-11-03 12:54:00

KAFKA探索中间件

2023-04-26 07:30:00

promptUI非结构化

2021-08-27 07:06:10

IOJava抽象

2024-05-11 07:29:48

Redis延迟队列优化

2022-12-06 08:12:11

Java关键字

2023-08-02 08:35:54

文件操作数据源

2024-09-09 08:53:56

2024-06-14 09:32:12

2022-09-08 08:50:17

SSDOracleCPU

2023-03-26 23:47:32

Go内存模型

2022-02-23 08:41:58

NATIPv4IPv6
点赞
收藏

51CTO技术栈公众号