抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

map

突然发现一个华科大佬的博客,学习一波

map是一种映射结构,能够存取键值对(键是唯一的)

map通常有两种实现方式:哈希表(std::unordered_map)、红黑树(std::map

哈希表

哈希表的查找删除均为O(1)

哈希表是一种空间换时间的算法,现在我们要存储一组键值对,假设键的范围是0~99,那么我们就开辟一个大小为100的数组,数组中存储了指向值的指针,于是我们就可以通过Key去数组中找指针,再找到值

value = a[key];

不过开辟大小为100的数组过于昂贵了,只开辟大小为10的数组,Key去找值时先取模,再去数组中找指针

value = a[key%10];

不过这样也带来了一个问题,我们无法区分key==21key==31,这种情况我们称之为哈希冲突,我们称21和31为同义词

解决哈希冲突的方式有:

  • 开放地址法
  • 拉链法

拉链法

Key取模后去数组中找指针,这个指针是一个链表的头,遍历链表,找到对应Key的value

这种方法非同义词间不会影响

拉链法

point = a[key%10];
while(point != nullptr)
{
if(point->key != key)
{
point = point->next;
}
else
{
break;
}
}
value = point->value;

红黑树

红黑树的查找删除为O(logN),但是空间效率更高

红黑树是一种自平衡的二叉搜索树,每个节点是黑色或红色

二叉搜索树

二叉搜索树(BST):排序二叉树,任意一个根节点,其左子树Key均小于根,其右子树Key均大于根

BST的操作复杂度取决于树的高度,但某些情况下BST会退化为一条链

平衡二叉树

平衡二叉树(AVL):左右子树的高度差不能大于1,操作过程中树一旦不稳定,就会进行旋转,以重新恢复平衡

avl-LL

avl-RR

avl-LR

avl-RL

红黑树

红黑树左右子树高度差不能超过一倍

  1. 所有null节点都认为是黑色。
  2. 一个红节点不能有红色孩子,即红色节点之间不能相邻。
  3. 红黑树中的节点到其任意叶子节点路径上的黑节点个数相同。
  4. 新插入的节点都是红色,在平衡过程中可能变色。

红黑树比平衡二叉树更容易保持平衡,于是效率更高

红黑树

参考

辜飞俊的博客

评论