`
dieslrae
  • 浏览: 35375 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Python版B树

 
阅读更多
话说以前的树都用java写的,最近发现python有点生疏了,于是用python写了个B树实现,B树在索引领域用得还是蛮多了,如果没记错mysql的默认索引好像就是B树...

首先是数据实体对象,很简单,只存放key,value
class Entity(object):
    '''数据实体'''
    
    def __init__(self,key,value):
        self.key = key
        self.value = value



然后节点对象
class Node(object):
    '''B树的节点'''
    
    def __init__(self):
        self.parent = None
        self.entitys = []
        self.childs = []
        
    def find(self,key):
        '''通过key查找并返回一个数据实体'''
        
        for e in self.entitys:
            if key == e.key:
                return e
            
    
    def delete(self,key):
        '''通过key删除一个数据实体,并返回它和它的下标(下标,实体)'''
        for i,e in enumerate(self.entitys):
            if e.key == key:
                del self.entitys[i]
                return (i,e)
            
            
    def isLeaf(self):
        '''判断该节点是否是一个叶子节点'''
        
        return len(self.childs) == 0
    
    
    def addEntity(self,entity):
        '''添加一个数据实体'''
        
        self.entitys.append(entity)
        self.entitys.sort(key=lambda x:x.key)
        
        
    def addChild(self,node):
        '''添加一个子节点'''

        self.childs.append(node)
        node.parent = self
        self.childs.sort(key=lambda x:x.entitys[0].key)



最后是Tree类
class Tree(object):
    '''B树'''
    
    def __init__(self,size=6):
        self.size = size
        self.root = None
        self.length = 0
        
    
    def add(self,key,value=None):
        '''插入一条数据到B树'''
        
        self.length += 1
        
        if self.root:
            current = self.root
            
            while not current.isLeaf():
                for i,e in enumerate(current.entitys):
                    if e.key > key:
                        current = current.childs[i]
                        break
                    elif e.key == key:
                        e.value = value
                        self.length -= 1
                        return
                else:
                    current = current.childs[-1]
                    
            current.addEntity(Entity(key,value))
                
            if len(current.entitys) > self.size:
                self.__spilt(current)
        else:
            self.root = Node()
            self.root.addEntity(Entity(key,value))
    
    
    def get(self,key):
        '''通过key查询一个数据'''
        
        node = self.__findNode(key)
        
        if node:  
            return node.find(key).value
            
            
    def delete(self,key):
        '''通过key删除一个数据项并返回它'''
        
        node = self.__findNode(key)
        
        if node:
            i,e = node.delete(key)
            
            #在节点不是叶子节点时需要做修复(取对应下标的子节点的最大的一个数据项来补)
            if not node.isLeaf():
                child = node.childs[i]
                j,entity = child.delete(child.entitys[-1].key)
                node.addEntity(entity)
                
                while not child.isLeaf():
                    node = child
                    child = child.childs[j]
                    j,entity = child.delete(child.entitys[-1].key)
                    node.addEntity(entity)
            
            self.length -= 1
            return e.value
    
    
    def isEmpty(self):
        return self.length == 0
    
                
    def __findNode(self, key):
        '''通过key值查询一个数据在哪个节点,找到就返回该节点'''
        
        if self.root:
            current = self.root
            
            while not current.isLeaf():
                for i, e in enumerate(current.entitys):
                    if e.key > key:
                        current = current.childs[i]
                        break
                    elif e.key == key:
                        return current
                else:
                    current = current.childs[-1]
            
            if current.find(key):
                return current
            
            
    def __spilt(self,node):
        '''
        分裂一个节点,规则为:
        1、中间的数据项移到父节点
        2、新建一个右兄弟节点,将中间节点右边的数据项移到新节点
        '''
        
        middle = len(node.entitys) / 2
        
        top = node.entitys[middle]
        
        right = Node()
        
        for e in node.entitys[middle + 1:]:
            right.addEntity(e)
            
        for n in node.childs[middle + 1:]:
            right.addChild(n)
        
        node.entitys = node.entitys[:middle]
        node.childs = node.childs[:middle + 1]
        
        parent = node.parent
        
        if parent:
            parent.addEntity(top)
            parent.addChild(right)
            
            if len(parent.entitys) > self.size:
                self.__spilt(parent)
        else:
            self.root = Node()
            self.root.addEntity(top)
            self.root.addChild(node)
            self.root.addChild(right)



测试代码
if __name__ == '__main__':
    t = Tree(4)
    t.add(20)
    t.add(40)
    t.add(60)
    t.add(70,'c') 
    t.add(80)       
    t.add(10) 
    t.add(30)
    t.add(15,'python')
    t.add(75,'java')
    t.add(85)
    t.add(90)
    t.add(25)
    t.add(35,'c#')
    t.add(50)
    t.add(22,'c++')
    t.add(27)
    t.add(32)
    
    print t.get(15)
    print t.get(75)
    print t.delete(35)
    print t.delete(22)
    t.add(22,'lua')
    print t.get(22)
    print t.length    
分享到:
评论

相关推荐

    使用Python实现B树

    B树是一种自平衡的搜索树,用于在有序数据集上进行高效的插入、删除和查找操作。以下是对B树的描述: 树结构:B树是一种多叉树,每个节点可以包含多个子节点。通常,B树的每个节点都会存储多个关键字和对应的值。 ...

    用python实现AVL树、B树、红黑树的插入、查找和删除操作

    Python实现B树时,要维护节点的度数、关键字和子节点,同时处理插入可能导致的节点满和删除可能导致的节点空的情况。 最后是红黑树,它是一种自平衡二叉查找树,但允许节点有颜色属性(红色或黑色),以确保任何...

    树编辑距离的 Python APTED算法_python_代码_下载

    这是 APTED 算法的 Python 实现,它是计算树编辑距离的最先进的解决方案 ,它取代了 RTED 算法 输入 目前,我们只支持输入树的所谓括号表示法,例如,编码{A{B{X}{Y}{F}}{C}}对应于以下树: A / \ B C /|\ X Y...

    python实现bk树

    在Python中实现BK树,主要目的是利用其特性来优化字符串的搜索过程,特别是在处理大量关键词或模式匹配时,能够显著提高效率。BK树的核心在于构建一个层次化的树形结构,其中每个节点都代表一个前缀,并且子节点是与...

    完整详细版Python全套教学课件 第04-B节 树算法.pptx

    Python 树算法 树算法是 Python 编程中的一种重要数据结构,用于存储和操作大量数据。树算法可以分为多种类型,包括树、森林、二叉树等。 树的定义:树是一种非线性结构,每个元素可以有多个前驱和后继。树可以为...

    BPlusTree:B+树的python实现

    B+树 在 B+ 树中插入数据 要在 B+ 树中插入数据,请运行: python bpt.py insert 文件名的默认参数是assgn2_bplus_data.txt 例子: python bpt.py insert assgn2_bplus_data.txt 在运行此查询时保存树(插入...

    深入B树:Python实现与应用解析

    在Python中实现B树需要理解其节点结构和操作方法,包括插入、查找、删除和遍历等。通过上述代码示例,我们可以看到如何在Python中实现B树的基本结构和操作。这些技术在实际的软件开发和数据处理中有着广泛的应用,...

    Python-Bplustree一个Python3的磁盘B树

    **Python-B+树详解** B+树(B Plus Tree)是一种自平衡的树,它能够保持数据有序,常用于数据库和文件系统中。在Python 3中,`Python-Bplustree`是一个实现磁盘存储B+树的库,特别适用于处理大量数据,如文件索引、...

    高级数据结构—B树、红黑树 python实现

    B树 一棵 2t (t>=2)阶(此处阶数表示每个节点最大的孩子数量)B树是一棵平衡的 2t 路搜索树。它或者是空树,或者是满足下列性质的树: 1、根节点至少有两个子女; 2、每个非根节点所包含的关键字个数j满足:t-1<=...

    python 分形樱花树

    # 分形樱花树 # “画树”函数 # 参数分别是树枝长度、画笔 def tree(branchLen, t): if (branchLen > 3): if (8 ) : if (random.randint(0, 2) == 0) : t.pencolor('snow') else : t.pencolor('lightcoral')...

    (python)圣诞树

    python turtle 海龟画图 圣诞树(原创于...1-128437438-null-null.142^v96^pc_search_result_base7&utm_term=python-turtle%28%E6%B5%B7%E9%BE%9F%E7%BB%98%E5%9B%BE%29%E5%9C%A3%E8%AF%9E%E6%A0%91&)

    python实现决策树模型.docx

    在Python中,我们可以使用scikit-learn库来实现决策树模型。本篇文章将详细讲解如何使用Python实现分类和回归决策树,并通过一个案例实战——员工离职预测模型的搭建,展示模型的应用及调优。 ### 1. 决策树模型的...

    基于持久性内存的单向移动B+树.docx

    【持久性内存与单向移动B+树】 随着新型非易失存储技术的发展,如PCM、ReRAM和MRAM,持久性内存(Persistent Memory, PM)因其字节级访问、非易失性和高存储密度,正逐渐成为未来主存与辅存融合的关键技术。与传统...

    Python 3的磁盘B +树-Python开发

    Bplustree Python 3的磁盘B +树。它感觉像是字典,但存储在磁盘上。 什么时候使用? 当要存储的数据不适合存储在内存中时当需要持久存储数据时当保持键i Bplustree Python 3的磁盘B + tree。感觉就像是字典,但存储...

    详解python实现FP-TREE进行关联规则挖掘

    它可以帮助我们发现大量数据中的隐藏模式,比如“购买了商品A的顾客通常也会购买商品B”。FP-TREE(频繁项集树)是关联规则挖掘中一种有效的数据结构,尤其适用于处理大规模数据集。本文将深入探讨如何使用Python来...

    外国人写的超牛“B+树源码”

    在B+树中,所有的键都存在于叶子节点中,而内部节点仅作为索引使用,这与B树有所不同。这样的设计使得所有数据的访问最终都会定位到叶子节点,确保了所有数据查找的路径长度一致,提高了搜索效率。同时,由于叶子...

    用python画棵圣诞树

    在Python编程中,我们可以利用turtle模块来创建图形化作品,比如本文中提到的圣诞树。turtle模块是一个简单易用的图形库,它提供了一系列的方法来控制一个虚拟的“turtle”在屏幕上绘制图形。下面我们将详细讲解如何...

    圣诞树源码-Python运行

    例如,通过`random.randint(a, b)`函数,我们可以随机生成在a和b之间(包括a和b)的整数,使得每棵树看起来都有所不同。 另一个依赖库是`time`。在圣诞树源码中,`time`库可能用于实现动画效果或者延迟,比如让圣诞...

    使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例

    本文将详细介绍如何使用Python的`turtle`库绘制樱花、玫瑰和圣诞树的具体步骤与技巧。 #### 二、Python 绘制樱花实例 ##### 1. 动态生成樱花 首先介绍一种动态生成樱花的方法。这种方法通过递归地调用函数来模拟...

    Python编写的2^n位kogge-stone树形加法器Verilog代码生成

    《Python实现2^n位Kogge-Stone树形加法器Verilog代码生成》 在数字电路设计领域,加法器是一种基础而重要的组件。Kogge-Stone加法器是一种高效的并行加法器算法,它通过流水线的方式使得数据在计算过程中能够并行...

Global site tag (gtag.js) - Google Analytics