15、Linux内核中用到的红黑树、STL标准库map用到的红黑树两者的区别
区别:Linux内核中用到的红黑树是可以存储同样的key的,但是STL标准库map中用到的红黑树不能存储相同的key,原因是map对原有的红黑树做了修改。
1.原有的红黑树结构是可以插入相同的key
例如以下是截取的nginx 的红⿊树的实现,nginx 的红⿊树的实现和Linux内核中红黑树的实现相似。
// 这个是截取 nginx 的红⿊树的实现,这段代码是 insert 操作中的⼀部分,只是为了(1)找到节点的位置,(2)改变为红色,执⾏完这个函数还需要检测插⼊节点后是否平衡(主要是看他的⽗节点是否也是红⾊节点) // 调⽤ ngx_rbtree_insert_value 时,temp传的参数为 红⿊树的根节点,node传的参数为待插⼊的节点 void ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,ngx_rbtree_node_t *sentinel) { ngx_rbtree_node_t **p; for (;;) { p = (node->key < temp->key) ? &temp->left : &temp->right;// 这⾏很重要 if (*p == sentinel) { break; } temp = *p; } *p = node; node->parent = temp; node->left = sentinel; node->right = sentinel; ngx_rbt_red(node); }
按照以上的带啊,如果要往上面这个红黑树上面再插入key=123时,此时 node->key =123, 我们来看这段代码
p = (node->key < temp->key) ? &temp->left : &temp->right;
当要插入的节点123和根节点345比较,往左走,然后和123比较,此时要插入的节点和123相同,按照 (node->key < temp->key) ? &temp->left : &temp->right 这行代码的话,它会往右走,然后再和234比较,比234小,所以它会插入到234的左节点上,此时红黑树上面有2个key为123的节点,如下图:
2.map中的红黑树不能插入相同的key
map<int, int> tep; tep.insert(make_pair<int,int>(1,20)); tep.insert(make_pair<int, int>(2, 21)); tep.insert(make_pair<int, int>(1, 22)); for (auto temp : tep) { cout << temp.second << endl; }
以上代码输出结构为20,21 ,那就说明当map发现再次插入的和之前的冲突时,直接会抛弃。map红黑树似于以下的代码
// 不插⼊相同节点 如果插⼊相同 让它变成修改操作 此时 红⿊树当中就不会有相同的key了定时器 key 时间戳 void ngx_rbtree_insert_value_ex(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,ngx_rbtree_node_t *sentinel) { ngx_rbtree_node_t **p; for (;;) { // {-------------add------------- if (node->key == temp->key) { temp->value = node->value; return; } // }-------------add------------- p = (node->key < temp->key) ? &temp->left : &temp->right;// 这⾏很重要 if (*p == sentinel) { break; } temp = *p; } *p = node; node->parent = temp; node->left = sentinel; node->right = sentinel; ngx_rbt_red(node); }
较之前的代码多了这个判断
//如果要插入的节点和之前的节点相同,则直接return掉,不插入
if (node->key == temp->key) { temp->value = node->value; return; }
111
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!