红黑树、B+Tree、B—Tree

红黑树

B-Tree

这三个通常都是把内存全部加载到内存里,然后再内存中进行处理的,数据量通常不会很大。

内存一般容量都在GB级别,比如说现在常见的4G、8G或者16G。

如果要处理的数据规模非常大,大到内存根本存不下的时候。这个时候只能先存到硬盘里,硬盘呢

容量又比内存大的多,因为没有办法把大规模的数据读到内存里,所以只能分批次的把需要处理的

数据从硬盘调到内存里,进行进一步处理。

操作数据是需要CPU去执行相关的指令的,cpu是不能直接和硬盘进行交互的。硬盘里的数据必需

先调到内存里头,才能进一步和CPU进行交互,进行数据处理。可以叫做一次硬盘I/O,然而这个

访问速度是非常慢的,内存单次的访问时间是纳秒级别,但是硬盘的访问的毫秒级的,1毫秒等于

100万纳秒。

降低树高就可以减少非常耗时的硬盘操作。

B+Tree

节点之间是用指针连接成了一个链表的结构

B+Tree常被用作数据库中的索引结构,那实际上每个元素都包含指向对应记录存储地址的指针。那此时呢,结点内的元素又被称为关键字(key),通过关键字中包含的指针可以索引到数据库中的某一条记录。

B+Tree相当于数据表中的一个索引,可以通过关键字,快速定位到数据表中的某一条记录,实际

上关键字的指针指向的是数据文件中这一条(id=23)这一条的地址,其他关键字也是一样的都在最

下面画的那一排下面记录呢。B+Tree本身也是作为一个索引文件存储在硬盘里的,但在实际应用

中不一定非要以ID作为关键字,也可以将姓名作为关键字等(可以给同一个数据表构建多个不同关

键字的索引来应对各种各样的查询需求)。

因为叶子节点包含了所有的关键字,所以要顺序查找所有的关键字的记录,就像遍历链表一样,

非常的方便。如果要随机查找某一关键字,也需要挨个遍历去寻找呢?那么B+Tree的叶子节点不

就是解决这个问题吗?可以帮助我们快速定位到叶子节点某一关键字,相当于给叶子节点建立的索

引,目的就是实现以log级别的复杂度,去查找叶子节点上的某一关键字记录。

所以整个B+Tree是一套多级索引结构,目的就是为了加速查询的速度。我们只需要通过指向根节

点的指针,就可以以log级别的复杂度查找到指定关键字对应的记录。

### 不同类型树结构的特点和应用场景 #### 二叉树 (Binary Tree) 二叉树是一种简单的树形数据结构,在这种结构中,每个节点最多有两个子节点。这类树并没有特定的顺序要求。 - **特点** - 节点数目不定,形状各异。 - 查找效率取决于树的高度,最坏情况下的时间复杂度为 O(n)[^4]。 - **应用场景** - 主要用于教学目的以及作为构建更复杂的树型结构的基础[^4]。 ```python class BinaryTree: def __init__(self, value): self.left = None self.right = None self.value = value ``` #### 红黑树 (Red-Black Tree) 红黑树属于自平衡二叉搜索树的一种形式,通过颜色标记来保持近似平衡状态,从而确保操作的时间复杂度接近于对数级别。 - **特点** - 插入删除时自动调整以维持大致平衡的状态。 - 平均情况下查找、插入和删除的操作成本大约为 O(log n),即使在极端条件下也不会超过两倍于此值[^3]。 - **应用场景** - 常见的应用领域包括实现关联数组或映射表等需要高效查询的数据容器;操作系统内核中的资源管理器也会采用此类算法优化调度策略。 ```python class RedBlackTree(BinaryTree): pass # 实现细节省略... ``` #### B树 (B-tree) B树设计之初是为了适应磁盘存储而产生的多路检索树,具有较高的分支因子,能够减少访问外部设备所需的I/O次数。 - 支持高效的范围查询与随机存取[^1]。 - **应用场景** - 数据库管理系统及文件系统的索引机制通常会基于此原理工作,因为这些环境往往涉及大量持久化对象之间的快速定位需求。 ```python class BTreeNode: def __init__(self, leaf=False): self.keys = [] self.children = [] self.leaf = leaf class BTree: def __init__(self, t): self.root = BTreeNode(True) self.t = t # ...其他方法定义... ``` #### B+树 (B+-tree) 作为一种改进版本的B树,B+树将所有的记录指针集中放置到了叶子节点处,并让它们之间相互链接起来构成有序列表的一部分。 - **特点** - 只有叶级才含有实际的关键字项及其对应地址信息; - 非末端部分仅负责指引方向而不携带具体资料; - 更适合做大规模集合上的遍历作业[^2]。 - **应用场景** - 大多数现代关系型数据库引擎都会优先考虑使用该种方式建立辅助索引来加速读写过程,尤其是在处理海量事务日志或是全文搜索引擎里边尤为突出。 ```python class BPlusTreeNode(BTreeNode): next_leaf = None class BPlusTree(BTree): # 细节差异体现在如何维护next_leaf属性等方面 ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值