B树和B+树 红黑树

有关于B树的漫画博客:https://www.jianshu.com/p/8b653423c586;

首先,B树的创建就是为了优化数据库查找,如果采用二叉查找树(时间复杂度只要LogN)来进行查找,那么在磁盘进行I/O操作时,(数据太大需要进行分页)每个磁盘页对应一个节点;最坏情况:查找次数等于输的高度(时间复杂度LogN),

自顶向下查找10:需要4次

那这样的话,通过将树变成矮树胖树即可;

B树的结构:

每个节点不超过磁盘页的大小(这里是3阶B树,每个磁盘页大小是3)即可;

每个节点的结构:

 

 

 

B+树是B树的变种:

优点:

1.单一节点存储更多的元素,使得查询的IO次数更少。(非子叶结点都存放的是索引,只有子叶结点才带有卫星数据;而B树的每个节点都有卫星数据,那这样B+树的结点会多出空间来放元素,也意味着B+树比B树还要矮胖);

2.所有查询都要查找到叶子节点,查询性能稳定。(B树最好的情况是根结点就是结果,最坏是子叶结点;而B+树的数据都要在子叶结点中的卫星数据获取)

3.所有叶子节点形成有序链表,便于范围查询。(如果想查询一个范围,B树的时间复杂度要比B+树高很多)

 

 

红黑树(logN):

 第五点很重要,每次自平衡的时候都要依据这一点来进行调整;

 

 TreeSet和TreeMap中都用到了红黑树的结构,Java8中HashMap的冲突解决中也采用了红黑树的结构;

### 红黑树与B+的特点及适用场景 #### 红黑树的特点 红黑树是一种自平衡的二叉搜索,其结构通过颜色规则旋转操作来保持平衡。它确保的高度始终保持在对数级别,从而提供较快的查找、插入删除操作[^1]。红黑树的节点包含键值对以及指向左右子节点的指针。这种结构使得红黑树在内存中的查询性能较好,适用于需要快速查找的数据结构[^5]。 #### B+的特点 B+是一种多路平衡,其设计目标是优化磁盘I/O操作。在B+中,所有数据都存储在叶子节点中,而非叶子节点仅存储索引信息。此外,叶子节点之间形成一个有序链表,便于范围查询顺序遍历[^3]。B+通过多叉结构显著降低高,例如在处理1亿条数据时,红黑树的高度约为30层,而B+仅需3-4层,这极大地减少了磁盘访问次数。 #### 红黑树与B+的关键区别 - **高与I/O优化**:B+通过多叉结构显著降低高,减少磁盘访问次数,而红黑树更适合内存中的快速查找操作。 - **范围查询支持**:B+的叶子节点链表结构使其能够高效地进行范围查询,而红黑树需要逐层回溯以完成类似操作。 - **数据存储位置**:B+将数据集中在叶子节点,非叶子节点仅存储索引信息;相比之下,红黑树的每个节点都可以存储实际数据[^4]。 #### 红黑树的应用场景 红黑树常用于内存数据结构,例如C++ STL中的`std::map``std::set`实现。由于其高效的插入、删除查找性能,红黑树适合于频繁进行动态操作的场景[^5]。 #### B+的应用场景 B+广泛应用于数据库索引的实现、文件系统以及其他需要高效范围查询的场景。例如,在关系型数据库中,B+被用来构建主键索引二级索引,以便快速定位记录并支持复杂的查询操作[^5]。 ```python # 示例代码:基于红黑树的字典实现(伪代码) class RedBlackTree: def __init__(self): self.root = None def insert(self, key, value): # 插入逻辑 pass def search(self, key): # 查找逻辑 pass # 示例代码:基于B+的索引实现(伪代码) class BPlusTree: def __init__(self, order): self.root = BPlusTreeNode(order) def insert(self, key, value): # 插入逻辑 pass def range_query(self, start, end): # 范围查询逻辑 pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值