[每天一道面试题 c++] Day12 map和set的区别?分别是怎么实现的

Day-12

问题

map和set的区别?分别是怎么实现的。

参考答案

参考:《STL源码剖析》chapter5 关联式容器set与map

mapset的底层都是通过红黑树实现的,mapset的区别有:

  1. map中的元素是key-value(关键字-值)对;而set中的元素是关键字;mapset都不允许插入重复元素。
  2. set的迭代器是const的(底层是通过使用红黑树的const iterator),所以不允许修改元素的值;map允许修改value的值,但是不允许修改key的值;mapset都不允许修改关键字,因为底层的红黑树需要依靠关键字保持有序性。
  3. map支持下标操作,而set不支持下标操作。需要注意的是map的下标操作是通过insert操作实现的,也就是尝试插入一个查询键值对,如果存在该键值对存在则返回。

进阶: 红黑树

参考:《STL源码剖析》chapter5 关联式容器概述和红黑树简介

二叉搜索树:二叉搜索树的任何节点的键值一定大于等于其左子树的任何一个节点的键值,同时小于等于其右子树中的任何一个节点的键值。

平衡二叉搜索树:平衡的意思是没有一个节点的深度过大,常见的有AVL-tree(自平衡二叉搜索树),RB-tree(红黑树)。

红黑树是平衡二叉树,其满足以下特点:

  1. 根节点一定是黑色的
  2. 每个节点不是黑色就是红色
  3. 父子节点不能同时是红色
  4. 任意节点到底层的NULL节点,所含黑节点数目一定相同(黑高相同)

由于含有n个节点的红黑树的高度为 O ( l g n ) O(lgn) O(lgn),所以红黑树的插入和删除的时间复杂度都是 O ( l g n ) O(lgn) O(lgn)`.

为什么mapset的底层采用红黑树而不是AVL树实现?

因为红黑树相比于AVL树在插入删除中的平均时间复杂度要小于AVL树的插入删除的平均时间复杂度。

由红黑树的特点2和特点4我们可以知道,红黑树的每一条到叶子节点的路径至少有50%的概率时黑节点,而插入和删除在遇到黑节点的时候复杂度降为 O ( 1 ) O(1) O(1),这就导致红黑树插入删除的平均时间复杂度应该小于或等于AVL树插入删除的平均时间复杂度的一半。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值