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的更多相关文章

  1. map 与 unordered_map

    两者效率对比: #include <iostream> #include <string> #include <map> #include <unordere ...

  2. map和unordered_map的差别和使用

    map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/billcyj/article/details/7 ...

  3. 【转】Map 与 Unordered_map

    map和unordered_map的差别和使用 map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/b ...

  4. STL中的map和unordered_map

    STL中的map和unordered_map map 头文件:#include 原理:std::map的内部实现了一颗红黑树,有对其键值进行排序的功能,所以map是一个有序的容器,map中的每一个元素 ...

  5. C++中map和unordered_map的用法

    1. 简介 map和unordered_map都是c++中可以充当字典(key-value)来用的数据类型,但是其基本实现是不一样的. 2. map 对于map的底层原理,是通过红黑树(一种非严格意义 ...

  6. map和unordered_map使用小结

    map和unordered_map unordered_map简介: #include <cstdio> #include <iostream> #include <un ...

  7. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

  8. 关于c++ STL map 和 unordered_map 的效率的对比测试

    本文采用在随机读取和插入的情况下测试map和unordered_map的效率 笔者的电脑是台渣机,现给出配置信息 处理器 : Intel Pentium(R) CPU G850 @ 2.90GHz × ...

  9. Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序

    写程序时,面临用Map还是unordered_map,总是很纠结,于是写了个程序进行测试 Map 与 unordered_map 横向与纵向测试,附带原始数据与测试程序 简单数据(4 Byte) 首先 ...

随机推荐

  1. Xcode 8 注释快捷键失效

    sudo /usr/libexec/xpccachectl 重启

  2. image 标签src

    最近对接到前端  src需要填写  src= "data:image/jpg;base64,xxxxxxxooooooo";  记录一下图片转换的问题,需要把图片转换成base64 ...

  3. ThinkPHP子类继承Controller类的注意事项

    在实际的开发中,往往有很多子类都继承自同一个父类,然后该父类再继承自框架内置类的需求. 比如: class Init extends Controller{...} class son1 extend ...

  4. python 获取命令行参数

    https://www.cnblogs.com/captain_jack/archive/2011/01/11/1933366.html zzz.py import sys from optparse ...

  5. [译]CQRS介绍

    以下内容均为看完原文后自己的理解.并非一字一句翻译,会尽量保持原文意思. 什么是 CQRS: CQRS 意思就是命令查询职责分离(Command Query Responsibility Segreg ...

  6. thymeleaf 字面量

  7. 利用python操作redis-cluster

    In [8]: def redis_cluster(): ...: redis_nodes = [{'host':'192.168.100.60','port':7000}, ...: {'host' ...

  8. 内核进程切换 switch_to

    参考: http://www.cnblogs.com/visayafan/archive/2011/12/10/2283660.html

  9. 挨批记后记--Jmeter环境安装

    挨批之后的艰难挣扎: 首先说所要造的数据是性能测试任务的创建,而创建任务还需要先创建场景,场景则又牵涉到jmx文件... 经过搜索后发现jmx文件通过jmeter生成,所以软件的安装就开始了.. jm ...

  10. OpenCV SVM

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...