算法与设计专题:15、Linux内核中用到的红黑树、STL标准库map用到的红黑树两者的区别
2021-03-04 22:29
标签:截取 的区别 部分 检测 位置 rgb key mic out 区别:Linux内核中用到的红黑树是可以存储同样的key的,但是STL标准库map中用到的红黑树不能存储相同的key,原因是map对原有的红黑树做了修改。 1.原有的红黑树结构是可以插入相同的key 例如以下是截取的nginx 的红?树的实现,nginx 的红?树的实现和Linux内核中红黑树的实现相似。 按照以上的带啊,如果要往上面这个红黑树上面再插入key=123时,此时 node->key =123, 我们来看这段代码 当要插入的节点123和根节点345比较,往左走,然后和123比较,此时要插入的节点和123相同,按照 (node->key key) ? &temp->left : &temp->right 这行代码的话,它会往右走,然后再和234比较,比234小,所以它会插入到234的左节点上,此时红黑树上面有2个key为123的节点,如下图: 2.map中的红黑树不能插入相同的key 以上代码输出结构为20,21 ,那就说明当map发现再次插入的和之前的冲突时,直接会抛弃。map红黑树似于以下的代码 较之前的代码多了这个判断 算法与设计专题:15、Linux内核中用到的红黑树、STL标准库map用到的红黑树两者的区别 标签:截取 的区别 部分 检测 位置 rgb key mic out 原文地址:https://www.cnblogs.com/zwj-199306231519/p/14323147.html// 这个是截取 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 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);
}
p = (node->key key) ? &temp->left : &temp->right;
mapint, int> tep;
tep.insert(make_pairint,int>(1,20));
tep.insert(make_pairint, int>(2, 21));
tep.insert(make_pairint, int>(1, 22));
for (auto temp : tep)
{
cout endl;
}
// 不插?相同节点 如果插?相同 让它变成修改操作 此时 红?树当中就不会有相同的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 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;
}
文章标题:算法与设计专题:15、Linux内核中用到的红黑树、STL标准库map用到的红黑树两者的区别
文章链接:http://soscw.com/index.php/essay/60191.html