插入相同“键值”key时Linux 内核中红黑树的使用

Linux 内核中提供了一个通用红黑树的实现(位于文件rbtree.h和rbtree.c),在日常的项目开发中,很多人也是直接将其代码取出来,然后自己“包装”一下就使用了。

   近期的使用中我有了一个这样的疑问,就是如果插入相同的key,是不是这个红黑树还能正常使用?这样做会不会破坏这个红黑树的结构?当然我们知道C++ STL中的multimap(multimap也是基于red-black tree实现的)是可以插入相同的key的,即支持“一对多”的关系。内核中的文档和网上的例子都是碰到有相同的key时,放弃这次操作不进行插入。这就让我疑惑了到底能不能这样做呢?

    为了弄清这个问题,我特地看了下《算法导论》中关于红黑树实现的章节,从中了解到红黑树在“插入”和“删除”操作后,若造成了当前树不满足了红黑树的性质会通过“旋转”,包括“左旋转”和“右旋转”来再进行平衡纠正,而旋转操作不会破坏“二叉搜索树”的性质(红黑树本身就是一个接近平衡的二叉搜索树),即经过旋转后红黑树的“中序遍历”的序列不会改变。也就是说,如果在插入相同的key的时候,我们将后插入的key放在相等的key的右边,之后不管怎么进行插入或删除操作,后加入的key始终被认为比之前的大。即它们的相对前后位置不会改变。这样就得出了这样一个结论:插入相同的key来使用是可以的,但根据key搜索的时候对于相同key的处理要我们自己来做。

针对Linux内核中提供的接口,如果根据一个key值搜索到了一个struct rb_node,这时我们就可以通过 rb_prev 和 rb_next 接口来在其前后搜索其他有着相同key的value。我自也写了个小的测试程序对其进行验证,结果显示这样做是可以的,这也可能是基于red-black tree实现多值map的的一个简单方法吧。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值