B树 Python的简单实现

只简单实现了插入功能

class entry(object):
def init(self,key,val):
self.key=key
self.value=val

class Node(object):
def init(self):
self.parent=None
self.entrys=[]
self.childs=[]

def addEntry(self,key,val):
    n=entry(key,val)  #生成一个对象
    for i,j in enumerate(self.entrys):
        if j.key>key:
            self.entrys.insert(i,n)
            break
    else:
        self.entrys.append(n)
    return

def Nodesplit(self,tree):
    left = Node()
    right = Node()
    left.entrys = self.entrys[:3]
    right.entrys = self.entrys[4:]
    left.childs = self.childs[:4]
    right.childs = self.childs[4:]

    if self.parent==None:
        # node=Node()
        # node.entrys.append(self.entrys[3])
        # left.parent=self.parent=node
        # node.childs.append(left)
        # self.entrys=self.entrys[4:]
        # self.childs= self.childs[4:]
        # node.childs.append(self)
        tree.root=Node()
        tree.root.entrys.append(self.entrys[3])
        left.parent = right.parent = tree.root
        tree.root.childs.append(left)
        tree.root.childs.append(right)



    else:
        for i, j in enumerate(self.parent.entrys):
            if j.key > self.entrys[3].key:
                self.parent.childs[i]=left
                self.parent.childs.insert(i+1,right)
                break
        else:
            self.parent.childs[-1]=left
            self.parent.childs.append(right)

        right.parent=left.parent=self.parent
        self.parent.addEntry(self.entrys[3].key, self.entrys[3].value)

        if( len(self.parent.entrys)>6):
            self.parent.Nodesplit(tree)
    return

class Tree(object):
def init(self):
self.root=None
self.size=6

def add(self,key,val):
    temp = self.root
    if temp==None:
        temp=Node()
        temp.addEntry(key,val)
        self.root=temp

    else:
        while len(temp.childs)!=0: #等于0说明为叶子
            for i,j in enumerate(temp.entrys): #默认从0开始
                if j.key>key:
                    temp=temp.childs[i]
                    break
            else:
                temp=temp.childs[-1]

        #退出while循环说明已经找到合适的节点,准备插入
        temp.addEntry(key,val)
    if len(temp.entrys)>6:
        temp.Nodesplit(self)

if name == “main”:
tree=Tree()
for i in range(10):
tree.add(i,str(i))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B树是一种常用的数据结构,用于实现数据库中的索引。下面是一个简单Python实现B树索引的示例: ```python class BTreeNode: def __init__(self, leaf=False): self.leaf = leaf self.keys = [] self.child = [] class BTree: def __init__(self, t): self.root = BTreeNode(True) self.t = t def insert(self, k): root = self.root if len(root.keys) == (2 * self.t) - 1: temp = BTreeNode() self.root = temp temp.child.insert(0, root) self.split_child(temp, 0) self.insert_non_full(temp, k) else: self.insert_non_full(root, k) def insert_non_full(self, x, k): i = len(x.keys) - 1 if x.leaf: x.keys.append((None, None)) while i >= 0 and k < x.keys[i]: x.keys[i + 1] = x.keys[i] i -= 1 x.keys[i + 1] = k else: while i >= 0 and k < x.keys[i]: i -= 1 i += 1 if len(x.child[i].keys) == (2 * self.t) - 1: self.split_child(x, i) if k > x.keys[i]: i += 1 self.insert_non_full(x.child[i], k) def split_child(self, x, i): t = self.t y = x.child[i] z = BTreeNode(y.leaf) x.child.insert(i + 1, z) x.keys.insert(i, y.keys[t - 1]) z.keys = y.keys[t: (2 * t) - 1] y.keys = y.keys[0: t - 1] if not y.leaf: z.child = y.child[t: 2 * t] y.child = y.child[0: t - 1] def search(self, k, x=None): if isinstance(x, BTreeNode): i = 0 while i < len(x.keys) and k > x.keys[i]: i += 1 if i < len(x.keys) and k == x.keys[i]: return x elif x.leaf: return None else: return self.search(k, x.child[i]) else: return self.search(k, self.root) # 使用示例 btree = BTree(3) btree.insert(1) btree.insert(2) btree.insert(3) btree.insert(4) result = btree.search(3) if result: print("Key found!") else: print("Key not found!") ``` 以上是一个简单B树索引的实现。它包括BTreeNode类和BTree类,可以通过调用insert方法插入键值对,通过调用search方法进行搜索。在使用示例中,我们插入了一些键值对,并搜索了一个存在的键值对。 需要注意的是,这只是一个基本的实现示例,实际应用中可能需要根据具体需求进行适当的改进和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值