c++实现文件版本类b+树

一 插入

  1. 无根节点
    当没有根结点时,操作相当简单,只是从存储空间中申请一个新结点,然后设置该结点的prev,next,is_inner,然后将要插入的数据插入该结点。
	void insert(const t_var& key, t_val v)
	{
		//没有元素,创建一个叶子结点,新数据插入并返回
		if (hdb->root_id == 0)
		{
			//创建结点,插入新数据并将根结点设置为该结点。
			hdb->root_id = create_node(0, 0, 0, { {key.val,v} }).id();
			//同步根结点数据
			flush_member(hdb, root_id);
			//插入完成,返回
			return;
		}
  1. 有根结点
    1. 生成查询路径
      b+树是一个自底向上插入的算法,所以我们在插入时,得先找到key需要插入到的路径。基本上就是结点及要插入位置的组合。由于可能插入的位置可能在最前方,超过了b+树所覆盖的范围,所以找到的结点位置可能为-1,增加一个self_pos以方便操作(其实不加也可以,可以通过sub_pos计算出来)。
		auto root = map_node(hdb->root_id);
		//生成路径
		struct t_path
		{
			t_auto_node node;
			int32_t self_pos;
			int32_t sub_pos;
		};
		std::vector<t_path>paths;
		{
			int32_t self_pos = -1;
			auto node = root;
			while (true)
			{
				auto sub_pos = node->find_range(key);
				paths.push_back({ node,self_pos,sub_pos });
				if (node->is_inner == 0)
					break;
				self_pos = sub_pos >= 0 ? sub_pos : 0;
				node = map_node(node->at(self_pos).val);
			}
		}
	2. 自底向上循环插入
		1. node还有空间
		2. 可插入prev
		3. 可插入next
		4. 无法插入,只能分裂
	3. 生成新根结点

二 删除

  1. 无根结点
  2. 有根结点
    1. 生成查询路径
    2. 自底向上循环删除
      1. node数量足够
      2. 可向prev借数据
      3. 可向next借数据
      4. 可合并到prev
      5. 可合并到next
    3. 根节点塌缩

【未完待续】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值