您的位置:首页 > 运维架构 > Linux

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

2014-04-20 00:25 791 查看
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的的一个简单方法吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: