B树的一种具体实现
2014-05-08 11:35
246 查看
B树是为了磁盘访问时候,经过最少次的读取磁盘读取相关数据的一个数据结构,B树深度小,比较平衡(2叉树分叉少,深度深,需要多次加载,一般用于内存查找)
访问节点大小如果是4k和8k能和内存页大小和磁盘访问大小契合
此文章写的比较粗,主要讲的是B树磁盘布局和对应的操作,插入删除部分请看算法导论。
需要本身对B树有一定了解才能理解B树对应磁盘的操作
•1.数据结构
•2.加载
•3.插入
•4.删除
•5.写磁盘
•1.数据结构
head固定大小,数据区域由Btree节点组成,B树节点组成如下:
addr是自己在整个文件中偏移
less 是比element1小的node的地址 elemnt中ptr是大于此element小于下个element的node的地址
所以一个node有n个element就会有n+1个孩子
•2.加载
1.加载free root,把freeaddr加入空闲表
把freelist从文件截断
2.加载root,获取root地址
查找算法
1. 存在:
返回节点和元素在节点位置
2. 不存在:
a.找下一级节点
比如key<e1查找node->less
elenmt n<key<elenmt n+1 查找element
n->ptr
b.下一级节点为0,查找失败 返回此节点
•3.插入
1.find node:
从磁盘加根节点然后查找,依次加载直到找到需要插入节点
2.a 节点没有满直接插入
2.b如果节点满,把此节点分裂,中间element插入parent
如果parent满,接着分裂,直到根节点
New node优先选择freelist中地址,freelist为空,选择文件尾
修改过的节点flag改为changed,changed节点加入缓存
3.刷磁盘:
文件流移动到node->addr,直接把node所有内容flush
插入节点不满,直接插入,否则分裂,如果父节点满,父节点继续分裂
newnode 分配优先从freelist中获取,如果freelist为空,从文件尾获取
•4.删除
1.find node
2.删除元素后不符合btree特点,merge节点
置相应节点flag为changed,删除节点加入空闲表
3.刷磁盘:
文件流移动到node->addr,直接把node所有内容flush
关闭系统时把freelist刷入磁盘(中途关机,再启动时没有freelist,造成空闲空间浪费)
删除算法:
删除非根节点
1.加载leftchildrightchild
2. 选择leftchildrightchild中element多的node
2.1.node是叶子
2.1.1.把删除的element位置填入node中最近元素
2.1.2.删除此叶子node中最后一个元素
2.2.node不是叶子
2.2.1.找到node子孙中最接近key的元素,插入
2.2.2.删除此叶子节点元素
删除叶子节点
1.直接删除
2.向兄弟节点借元素(通过根节点转移)
3.合并
•5.写磁盘
有change的节点包括New的节点,放入缓存,节点个数到一定数值把所有节点刷入磁盘即可 最后清除缓存
系统关闭时候在文件尾刷入freelist(每个free节点地址即可),更新free root值
参考资料:
https://code.google.com/p/btrfs-learning/
访问节点大小如果是4k和8k能和内存页大小和磁盘访问大小契合
此文章写的比较粗,主要讲的是B树磁盘布局和对应的操作,插入删除部分请看算法导论。
需要本身对B树有一定了解才能理解B树对应磁盘的操作
•1.数据结构
•2.加载
•3.插入
•4.删除
•5.写磁盘
•1.数据结构
head固定大小,数据区域由Btree节点组成,B树节点组成如下:
addr是自己在整个文件中偏移
less 是比element1小的node的地址 elemnt中ptr是大于此element小于下个element的node的地址
所以一个node有n个element就会有n+1个孩子
•2.加载
1.加载free root,把freeaddr加入空闲表
把freelist从文件截断
2.加载root,获取root地址
查找算法
1. 存在:
返回节点和元素在节点位置
2. 不存在:
a.找下一级节点
比如key<e1查找node->less
elenmt n<key<elenmt n+1 查找element
n->ptr
b.下一级节点为0,查找失败 返回此节点
•3.插入
1.find node:
从磁盘加根节点然后查找,依次加载直到找到需要插入节点
2.a 节点没有满直接插入
2.b如果节点满,把此节点分裂,中间element插入parent
如果parent满,接着分裂,直到根节点
New node优先选择freelist中地址,freelist为空,选择文件尾
修改过的节点flag改为changed,changed节点加入缓存
3.刷磁盘:
文件流移动到node->addr,直接把node所有内容flush
插入节点不满,直接插入,否则分裂,如果父节点满,父节点继续分裂
newnode 分配优先从freelist中获取,如果freelist为空,从文件尾获取
•4.删除
1.find node
2.删除元素后不符合btree特点,merge节点
置相应节点flag为changed,删除节点加入空闲表
3.刷磁盘:
文件流移动到node->addr,直接把node所有内容flush
关闭系统时把freelist刷入磁盘(中途关机,再启动时没有freelist,造成空闲空间浪费)
删除算法:
删除非根节点
1.加载leftchildrightchild
2. 选择leftchildrightchild中element多的node
2.1.node是叶子
2.1.1.把删除的element位置填入node中最近元素
2.1.2.删除此叶子node中最后一个元素
2.2.node不是叶子
2.2.1.找到node子孙中最接近key的元素,插入
2.2.2.删除此叶子节点元素
删除叶子节点
1.直接删除
2.向兄弟节点借元素(通过根节点转移)
3.合并
•5.写磁盘
有change的节点包括New的节点,放入缓存,节点个数到一定数值把所有节点刷入磁盘即可 最后清除缓存
系统关闭时候在文件尾刷入freelist(每个free节点地址即可),更新free root值
参考资料:
https://code.google.com/p/btrfs-learning/
相关文章推荐
- M阶B树具体实现
- 单点登录的一种具体实现
- 用js+iframe形成页面的一种遮罩效果的具体实现
- 用js+iframe形成页面的一种遮罩效果的具体实现
- MySql批量插入多条数据的一种具体实现方法
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- Servlet+Jsp实现图片或文件的上传功能具体思路及代码
- 利用网卡地址和OpenUDID,实现获取设备唯一标识的一种方案
- 一种SOA架构的实现
- 51单片机 同时扩展ROM,RAM的具体实现及kiel的具体设置
- Android动态图片选择的一种简单实现方式
- CTI呼叫中心平台的一种实现
- 九九乘法表的一种简单实现
- 用tableView实现的一种加载数据的布局
- Android jni aes加解密,实现文件的加解密,具体实现可以自行修改,上面的代码为简单介绍,下面的是JNI端实现文件加解密,可以修改为字符串加解密
- 一种高效无锁内存队列的实现
- 关于实现在阿里的Antd的Modal上实现动态表的一种思路
- 浅析linux开发工具adb具体实现
- 【转载】JQuery中如何传递参数如click(),change()等具体实现
- jquery js 重置表单 reset()具体实现代码