插入相同“键值”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的的一个简单方法吧。
近期的使用中我有了一个这样的疑问,就是如果插入相同的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的的一个简单方法吧。
相关文章推荐
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- linux 生成KEY的方法与使用
- linux 3.18内核使用device tree方式修改网络驱动遇到的问题
- (转载) 使用 Linux 系统调用的内核命令, 探究 SCI(systen call interface) 并添加自己的调用.
- 对Linux0.11 "内核空间不使用写时复制机制" 本质理解
- Linux下的内核测试工具——perf使用简介
- 使用 ftrace 调试 Linux 内核,第 3 部分
- 使用 ftrace 调试 Linux 内核,第 1 部分
- 使用 ftrace 调试 Linux 内核,第 2 部分
- Linux 内核使用的 GNU C 扩展
- Linux与Linux和Linux与Windows使用key登录
- 使用 /proc 文件系统来访问 Linux 内核的内容
- Linux 内核使用register_filesystem添加自定义文件系统deanfs
- 为AM335x移植Linux内核主线代码(35)使用platform中的GPIO
- Linux 内核定时器及使用方法
- Linux 内核list使用
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 Linux 系统调用的内核命令