C++面试常见题目7_STL之map与unordered_map(红黑树VS哈希表)

map与unordered_map

  • 相同:两者都是键-值对的集合,关联容器的一种。两者中的元素都是pair,同时拥有实值和键值。两者都不允许有两个相同的键值(实值可以相同)。两个的外部接口调用基本一致。
  • 不同:内部实现机理不同,即map内部实现了一个红黑树;unordered_map内部实现了一个哈希表。(两者的比较成为红黑树与哈希表的比较)。由于内部实现机理不同(底层实现)造成以下不同。
  1. map的有序性:红黑树(非严格平衡二叉树),该结构具有自动排序的功能,因此map内部的所有元素都是有序的
  2. unordered_map的无序性:哈希表不会根据key值大小进行排序,存储时是根据key的hash值判断元素是否相同,因此unordered_map内部元素是无序的。
  3. map的运行效率:红黑树可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。
  4. unordered_map的运行效率:哈希表的查找的时间复杂度可达到O(1)
  5. unordered_map内存占用比map高。
  • 红黑树

  • 定义:RB-tree是一个需满足以下规则的二叉搜索树
  1. 每个结点不是红色就是黑色
  2. 根结点为黑色
  3. 每个叶结点(空结点)是黑色的
  4. 每个红色结点的两个子结点都是黑色的
  5. 从任一节点到其每个叶子结点的所有路径都包含相同数目的黑色节点。
  • 为什么红黑树是一种好的搜索树
  1. 一棵内部有n个结点的红黑树的高度至多为2∗logn(性质4)。这保证了红黑树任意操作的复杂度都是O(logn)。
  • 基本操作:左旋,右旋,重新着色
  • 目的:红黑树在插入,删除过程中可能会破坏原本的平衡条件导致不满足红黑树的性质,这时候一般情况下要通过左旋、右旋和重新着色这个三个操作来使红黑树重新满足平衡化条件。
  1. 左旋
  2. 右旋
  3. 重新着色
  • 哈希表

  • 定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
  • 哈希函数

  1. 直接寻址法
  2. 数字分析法、
  3. 平方取中法
  4. 折叠法
  5. 随机数法
  6. 除留余数法
  • 解决碰撞(冲突):

  1. 开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列(1)线性探测 di=1,2,3,…,m-1;(2)二次探测 di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2);(3)伪随机探测 di=伪随机数序列,

  2. 再散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
  3. 链地址法:如果遇到冲突,会在原地址新建一个空间,然后以链表结点的形式插入到该空间。

  • 查询性能:

  1. 散列函数是否均匀

  2. 处理冲突的方法

  3. 散列表的装填因子 :α= 填入表中的元素个数 / 散列表的长度

本系列文章目的为个人准备面试的简单总结,文中多有不足,敬请批评指正!

参考:

https://blog.csdn.net/u010853261/article/details/54312932

http://www.cnblogs.com/polly333/p/4798944.html

https://www.cnblogs.com/s-b-b/p/6208565.html

猜你喜欢

转载自blog.csdn.net/zzhang_12/article/details/81173891