C++ map与unordered_map
map与unordered_map对比
| map | unordered_map |
|---|---|
| 红黑树(非严格二叉平衡搜索树)实现 | 哈希表实现 |
| 有序 | 无序 |
| —— | 查找时间复杂度为O(1),非常快 |
| 空间消耗较大 | 空间消耗较大 |
哈希表(hash table)
定义
用hash函数(即散列函数)把key映射到对应value在数组(即散列表,注:是一块连续空间)中的位置。
即:value的存储位置=f(key)
其中key为任意长度,而散列表的长度固定,即这种转换是一种压缩映射。
实现
最常用拉链法,连续的数组空间,数组每一个元素是一个链表的头指针。根据元素的一些特征把元素分配到不同的链表中去。
充分利用了数组和链表的优点:
数组的特点是:寻址容易,插入和删除困难;
而链表的特点是:寻址困难,插入和删除容易。
特点
查找快
红黑树
特点
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长(红黑树是相对是接近平衡的二叉树)。
因为性质4导致了路径不能有两个毗连的红色节点。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。
又因为根据性质5所有最长的路径都有相同数目的黑色节点,所以没有路径能多于任何其他路径的两倍长。
故而这个树大致上是平衡的。因为插入、删除和查找操作最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
时间复杂度
O(lgn)
红黑树的基本操作--左旋和右旋
红黑树的基本操作有添加、删除,添加、删除后都要有旋转操作,目的是维持红黑树的特性。
左旋:

对x进行左旋,指将x右孩子y替换x原位置,将x作为y的新左孩子,将y的原左孩子作为x的右孩子。“x变为了左节点”
右旋:
对x进行右旋,指将x左孩子y替换x原位置,将x作为y的新右孩子,将y的原右孩子作为x的左孩子。“x变为了右节点”
旋转操作保持一颗二叉搜索树仍是二叉搜索树。
未完待续
reference:
https://blog.csdn.net/BillCYJ/article/details/78985895
https://blog.csdn.net/duan19920101/article/details/51579136
https://www.cnblogs.com/skywang12345/p/3245399.html
https://baike.baidu.com/item/红黑树/2413209?fr=aladdin
C++ map与unordered_map的更多相关文章
- map 与 unordered_map
两者效率对比: #include <iostream> #include <string> #include <map> #include <unordere ...
- map和unordered_map的差别和使用
map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/billcyj/article/details/7 ...
- 【转】Map 与 Unordered_map
map和unordered_map的差别和使用 map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/b ...
- STL中的map和unordered_map
STL中的map和unordered_map map 头文件:#include 原理:std::map的内部实现了一颗红黑树,有对其键值进行排序的功能,所以map是一个有序的容器,map中的每一个元素 ...
- C++中map和unordered_map的用法
1. 简介 map和unordered_map都是c++中可以充当字典(key-value)来用的数据类型,但是其基本实现是不一样的. 2. map 对于map的底层原理,是通过红黑树(一种非严格意义 ...
- map和unordered_map使用小结
map和unordered_map unordered_map简介: #include <cstdio> #include <iostream> #include <un ...
- 原 c++中map与unordered_map的区别
c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...
- 关于c++ STL map 和 unordered_map 的效率的对比测试
本文采用在随机读取和插入的情况下测试map和unordered_map的效率 笔者的电脑是台渣机,现给出配置信息 处理器 : Intel Pentium(R) CPU G850 @ 2.90GHz × ...
- Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序
写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试 Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序 简单数据(4 Byte) 首先 ...
随机推荐
- get return value of python in shell
from: https://stackoverflow.com/questions/2115615/assigning-value-to-shell-variable-using-a-function ...
- c# GC 新典型
public class testGC : MonoBehaviour { class XDict<K, V> { public void TryGetValue(K key, V val ...
- oracle第三天笔记
DDL语句管理表 /* Oracle体系结构: 数据库 ---> 数据库实例ORCL ---> 表空间 (用户里面的创建表) ---> 数据文件 地球 ---> 中国 ---& ...
- java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
Hibernate4.x与spring3.x整合,有关事务的处理,用Junit4测试,出现org.springframework.beans.factory.BeanCreationException ...
- python模块sys
#!/bin/env python #-*- encoding=utf8 -*- import sys if __name__=="__main__": # 在解释器启动后, ar ...
- Linux性能测试分析命令_vmstat
vmstat命令主要是对操作系统的虚拟内存.进程.IO读写.CPU活动等整体情况进行统计.但是它不能对某个进程进行深入分析. vmstat基本语法 命令使用格式:vmstat [options] [d ...
- 自行编译mwan加入openwrt里
参考源文:http://www.right.com.cn/forum/thread-124449-1-1.html 本例以 opoenwrt 12.09正式版为例,原软件来自openwrt 英文论坛: ...
- [JS]如何理解JS中的类和对象
-------------------------------------------------------------------------------------------- 变量:自由的 ...
- Spring3.0学习1.2(使用annotation)
使用annotation 首先 xml文件更改 新加xslt <?xml version="1.0" encoding="UTF-8"?> < ...
- nbtscan工具
这是一款用于扫描Windows网络上NetBIOS名字信息的程序.该程序对给出范围内的每一个地址发送NetBIOS状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,NBTScan列出它的 ...