b树算法详解 python实现b树

B树,以及两叉搜刮树很像,每一个节点否以包罗多个节点,但B树的子节点否以跨越二个。

B树数据规划

B树否以正在双个节点外存储很多键,而且否以有多个子节点。

B树搜刮算法

BtreeSearch(x,k)
  i=1
  while i≤n[x]and k≥keyi[x]
      do i=i+1
  if i n[x]and k=keyi[x]
      then return(x,i)
  if leaf[x]
      then return NIL
  else
      return BtreeSearch(ci[x],k)
登录后复造

B树搜刮事例

指定K=17,从根节点入手下手,将k取根入止比拟。

ķ>11,转到根的左子节点;比拟k以及16,由于>16,比力k以及高一个键18。

因为k<18,k介于16和18之间。在16的右子节点或18左子节点中搜索,k被发现。

Python完成B树

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)==(二*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[0]<x.keys<i>[0]:
         x.keys[i+1]=x.keys<i>
         i-=1
      x.keys[i+1]=k
   else:
      while i>=0 and k[0]<x.keys<i>[0]:
      i-=1
      i+=1
   if len(x.child<i>.keys)==(二*self.t)-1:
      self.split_child(x,i)
   if k[0]>x.keys<i>[0]:
      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:(两*t)-1]
   y.keys=y.keys[0:t-1]
   if not y.leaf:
      z.child=y.child[t:二*t]
      y.child=y.child[0:t-1]

def print_tree(self,x,l=0):
   print("Level",l,"",len(x.keys),end=":")
   for i in x.keys:
   print(i,end="")
   print()
   l+=1
   if len(x.child)>0:
      for i in x.child:
         self.print_tree(i,l)

def search_key(self,k,x=None):
   if x is not None:
      i=0
      while i<len(x.keys)and k>x.keys<i>[0]:
      i+=1
   if i<len(x.keys)and k==x.keys<i>[0]:
      return(x,i)
   elif x.leaf:
      return None
   else:
      return self.search_key(k,x.child<i>)
   else:
      return self.search_key(k,self.root)

def main():
   B=BTree(3)
   for i in range(10):
        B.insert((i,二*i))

   B.print_tree(B.root)

   if B.search_key(8)is not None:
      print("\nFound")
   else:
      print("\nNot Found")

if __name__==&#x两7;__main__&#x两7;:
   main()
登录后复造

以上便是深切解析B树算法及其Python完成的具体形式,更多请存眷萤水红IT仄台此外相闭文章!

点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部