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) 首先 ...
随机推荐
- 【Noip模拟 20161005】友好城市
问题描述 小ww生活在美丽的ZZ国.ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii.jj的公路只能从ii连到jj).城市ii.jj是友好城市当且仅当从城市ii能到达城市jj并 ...
- open read split
open 来打开文件, 其具体表现为 open('文件名或路径', 'r or w or other', 位置?) 其生成一个文件类型的对象 file object. 可写做 FILENAME = ...
- ASP.NET HTTP 协议
http是无状态的,不会记得“上个请求***”,所以哪怕是同一个页面中的js.css.jpg也都要重复的提交Accept-Language.Accept-Encoding.Cookie等. 一般情况下 ...
- Structs复习 开始 第一个helloworld项目
大体已经学完ssh了 感觉一起做一个项目有点难 计划先用一下独立的Structs 然后再把数据库操作换成hibernate 然后在用Spring 整合 计划用10天左右吧 但今天开始用Struct ...
- 解决iframe在iphone不兼容的问题
<div class="scroll-wrapper"> <iframe src="地址"></iframe> </d ...
- svn:Cannot negotiate authentication mechanism
解决方案:在eclipse->window->preference->team->svn中将svn接口设定为svnkit.
- Java中的BigDecimal类精度问题
bigdecimal 能保证精度的原理是:BigDecimal的解决方案就是,不使用二进制,而是使用十进制(BigInteger)+小数点位置(scale)来表示小数,就是把所有的小数变成整数,记录小 ...
- 线段树模板(HDU 6356 Glad You Came)
题目: HDU 6356 http://acm.hdu.edu.cn/showproblem.php?pid=6356 很裸的线段树 #include<bits/stdc++.h> #de ...
- Fixation index
:或者1.简单介绍 固定指数(FST)是一种由遗传结构决定的种群分化指标.它通常是由遗传多态性数据,如单核苷酸多态性(SNP)或微卫星估计.作为莱特f统计的一个特例,它是种群遗传学中最常用的统计方法之 ...
- RepeatMasker
1.简介 RepeatMasker是一款基于Library-based,通过相似性比对来识别重复序列,可以屏蔽序列中转座子重复序列和低复杂度序列(默认将其替换成N).提供有在线服务.RepeatMas ...