`

Python BTree 学习-广度优先搜索

阅读更多
不说别的见源码




#coding=utf-8
import sys, os
import bisect
import string


class Entity(object):
    """data entity"""
    __slots__ = ("key", "value",)

    def __init__(self, key, value):
        self.key = key
        self.value = value

    def __str__(self):
        return self.key

    def __unicode__(self):
        return self.__str__()

    def __cmp__(self, key):
        if key > self.key:
            return 1
        elif key == self.key:
            return 0
        else:
            return -1


class Node(object):
    """B Node"""
    #__slots__ = ("parent", "entities", "childes",)

    def __init__(self):
        self.parent = None
        self.entities = []
        self.childes = []

    def find(self, key):
        i = bisect.bisect_left(self.entities, key)
        if i != len(self.entities) and self.entities[i].key == key:
            return self.entities[i].value

    def delete(self, key):
        """delete key"""
        i = bisect.bisect_left(self.entities, key)
        if i != len(self.entities) and self.entities[i].key == key:
            e = self.entities[i]
            del self.entities[i]
            return i, e
        else:
            return None, None


    def is_leaf(self):
        return len(self.childes) == 0

    def add_entity(self, entity):
        self.entities.append(entity)
        self.entities.sort(key=lambda x:x.key)

    def add_child(self, node):
        self.childes.append(node)
        node.parent = self
        self.childes.sort(key=lambda x:x.entities[0].key)


class BTree(object):
    def __init__(self, size=6):
        self.size = size
        self.root = None
        self.length = 0

    def add(self, key, value=None):
        self.length += 1

        if self.root:
            current = self.root
            while not current.is_leaf():
                for i, e in enumerate(current.entities):
                    if e.key > key:
                        current = current.childes[i]
                        break
                    elif e.key == key:
                        e.value = value
                        return
                else:
                    current = current.childes[-1]

            current.add_entity(Entity(key, value))

            if len(current.entities) > self.size:
                self._split_(current)
        else:
            #init root
            self.root = Node()
            self.root.add_entity(Entity(key, value))


    def _split_(self, node):
        """Rules
        1、middle index node become parent
        2、create right Nodes move parents right go to this node
        """
        middle = len(node.entities) / 2
        top = node.entities[middle]

        right = Node()
        for e in node.entities[middle + 1:]:
            right.add_entity(e)

        for n in node.childes[middle + 1:]:
            right.add_child(n)

        left = node
        left.entities = node.entities[:middle]
        left.childes = node.childes[:middle + 1]

        parent = node.parent
        if parent:
            parent.add_child(right)
            parent.add_entity(top)
            if len(parent.entities) > self.size:
                self._split_(parent)
        else:
            self.root = Node()
            self.root.add_entity(top)
            self.root.add_child(left)
            self.root.add_child(right)


    def get(self, key):
        e, v = self._find_node_(key)
        return v


    def _find_node_(self, key):
        if self.root:
            current = self.root
            while current.entities:
                bisect.bisect_left(current.entities, key)
                for i, e in enumerate(current.entities):
                    if e.key > key:
                        current = current.childes[i]
                        break
                    elif e.key == key:
                        return e, e.value
                else:
                    current = current.childes[-1]


    def delete(self, key):
        """#一般都标记删除不真删除"""
        pass


def bfs(root):
    """Iterator traverses a tree in breadth-first order."""
    queue = []
    queue.append(root)
    while len(queue) > 0:
        node = queue.pop(0)
        yield node
        for child in node.childes:
            queue.append(child)
    return


if __name__ == '__main__':
    t = BTree()
    for i in xrange(26):
        key = string.lowercase[i % 26]
        value = i
        t.add(key, value)
    root = t.root

    print "generate tree ......"
    for node in bfs(root):
        if node.parent:
            print "parent",
            for e in node.parent.entities:
                print e,
        print
        for e in node.entities:
            print e,
        print

    print
    print "test btree get"
    for i in xrange(26):
        key = string.lowercase[i % 26]
        print key, t.get(key), "-",



0
7
分享到:
评论

相关推荐

    数据结构BTree B-Tree B+Tree B*Tree 的特征说明

    数据结构 BTree B-Tree B+Tree B*Tree 的特征说明 一、B 树(Binary Search Tree) * 定义:二叉搜索树 * 特征: 1. 非叶子结点至多拥有两个儿子(Left 和 Right) 2. 所有结点存储一个关键字 3. 非叶子结点的...

    BtreeNET:BtreeNET是基于磁盘的.NET Btree库-开源

    在实际应用中,BtreeNET可以被用在各种需要高效数据管理的场合,例如大型数据库系统、文件索引服务、日志管理、搜索引擎的倒排索引构建等。它的高效率和大容量存储能力使得它成为处理大量结构化数据的理想选择。 ...

    btree-master_B数的数据结构_year8em_

    "Btree-master"项目提供了C语言实现的B树数据结构,对于想要深入理解数据库和文件系统底层原理的学习者来说,这是一个很好的实践资源。通过这个项目,学习者可以了解B树的内部工作原理,掌握如何在实际代码中实现...

    BTree-Real-Estate-:使用Django Framework构建的完全成熟的房地产Web应用程序

    Django是一个用Python编写的开源框架,旨在简化Web应用的开发过程,提供MVC(模型-视图-控制器)架构模式,强调可重用性和“干”(Don't Repeat Yourself)原则。通过使用Django,开发者可以快速构建功能丰富的、高...

    BTree,B-Tree,B+Tree,BTree都是什么.doc

    B树的搜索从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子。如果左儿子或右儿子的指针为空,则报告找不到...

    Python库 | BTrees-4.9.2-cp39-cp39-win32.whl

    BTrees是Python中一个高效的键值对存储库,主要用于处理大量数据。这个库提供了一种在内存和硬盘之间高效管理大型数据集的方式。BTrees库是Zope对象数据库(ZODB)的一部分,但也可以独立使用。 BTrees的核心是B树...

    BTree-and-BPlusTree-Realize:BTree和BPlusTree实现

    2.BTree.h,BTree.cpp:B树的声明、实现代码 3.BPlusTree.h,BPlusTree.cpp:B+树的声明、实现代码,注:大多数的函数,B和B+都是一样的,但是我还是分开写了,比如输出函数 4.Context.h:策略方法的实现 5.mian.cpp:...

    Python库 | python_tables_lib-1.0.0-py3-none-any.whl

    Python表格库(Python Tables ...总的来说,Python Tables Library是处理大数据的利器,尤其适用于需要高效存取结构化数据的科学计算、数据分析或机器学习项目。它的易用性和高性能使其成为Python开发者的热门选择。

    Python库 | BTrees-4.4.1-cp34-cp34m-macosx_10_6_intel.whl

    BTree是一种多路搜索树,能够保持数据的排序,支持高效地插入、删除和查找操作。BList类似于Python的列表,但在处理大量元素时具有更好的性能。BDict则是一种键值对的集合,其内部结构也是B-tree,因此在插入、删除...

    Btree-source-code:C中高并发B树源代码的工作项目-Source code

    Btree源代码 C中有关高并发B树源代码的工作项目。您可能希望下载单独的数据库项目以获取最新版本。 大多数C文件都可以在Windows和Linux下编译。 多根节点子目录中正在研究的一个想法通过创建最新更新的根版本的只读...

    基于python开发的北邮人论坛全站搜索引擎

    综上所述,"基于Python开发的北邮人论坛全站搜索引擎"项目涵盖了Python网络爬虫、自然语言处理、信息检索、数据结构、机器学习等多个IT领域的知识,对于提升开发者在这些方面的能力具有很高的实践价值。通过学习和...

    Python库 | BTrees-4.3.1-py2.7-win-amd64.egg

    BTrees是Python中一个高效的键值存储库,主要用于处理大量数据。这个库是基于B-树(B-tree)数据结构实现的,B-树是一种自平衡的查找树,特别适合在磁盘等慢速存储介质上操作大量数据。BTrees库在Python中由Zope ...

    btree-vv.rar_btree_b树系统_图书馆管理系统_数据结构 管理系统_用数据结构设计图书管理

    B树是一种多路搜索树,每个节点可以有多个子节点。在3阶B树中,每个节点最多包含三个元素(key),两个子节点(分支)。B树的特点在于其平衡性,保证了任何节点到根节点的路径长度大致相同,这使得查找效率较高,且...

    Python库 | BTrees-4.1.3.win32-py2.6.exe

    **Python库BTrees详解** BTrees是Python中一个高效、可扩展的数据结构库,特别适合在内存或硬盘上处理大量数据。它是一个基于B-树(B-tree)算法的键值存储系统,由ZODB(Zope Object Database)项目开发并维护。在...

    Oracle-Btree索引.pptx

    Oracle-Btree索引,索引的ppt

    BTree入门讲解

    **BTree入门详解** BTree(B树),全称为平衡多路查找树,是一种自平衡的树数据结构,常用于数据库和文件系统中。它的设计目的是为了高效地存储和检索大量数据,尤其适用于磁盘等慢速存储介质,因为BTree能够减少...

    btree索引.txt

    ### BTree索引详解 #### 一、BTree索引概念 BTree(平衡树)索引是数据库中一种常见的索引类型,特别是在关系型数据库系统中被广泛使用。它是一种自平衡的树数据结构,能够保持数据有序,并且允许进行高效的插入、...

    BTree数据结构课程设计C++版

    **BTree数据结构详解** BTree(B-Tree,或称B树)是一种自平衡的树数据结构,常用于数据库和文件系统中。它能够保持数据排序,允许对数据进行快速查找、添加和删除操作。BTree的主要特性是每个节点可以有多个子节点...

    PHP实现二叉树的深度优先与广度优先遍历方法

    二叉树遍历是访问二叉树中所有节点的一种方法,主要分为两种策略:深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方式在PHP中可以通过数据结构和算法实现。 **一、广度优先遍历(BFS)** 广度优先遍历的...

    sqlite-btree

    Btree数据结构以平衡多路搜索树的形式存在,确保了任何节点到根节点的路径长度大致相同,从而优化了数据访问效率。Btree的关键特性包括分层存储、有序存储和自平衡调整。 1. 分层存储:Btree将大量数据分割成多个...

Global site tag (gtag.js) - Google Analytics