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. php计算程序运行时间

    这里介绍一下 microtime() 这个函数,microtime() 用的不多,但是不能不知道这个函数,它是返回当前 Unix 时间戳和微秒数.例如:echo microtime(); 会返回:0. ...

  2. crontab使用说明及例子程序

    http://blog.csdn.net/yygydjkthh/article/details/7845639 http://walkerqt.blog.51cto.com/1310630/16901 ...

  3. UI5-学习篇-15-云连接SAP Cloud Connector

    请关注地址:http://blog.itpub.net/29829936/viewspace-2128829/ 1.SCC下载及安装 https://tools.hana.ondemand.com/# ...

  4. java定时任务——间隔指定时间执行方法

    摘要:运行 main 方法的时候开始进行定时任务, service.scheduleAtFixedTate(task,5,TimeUnit.SECONDS);方法为关键 此次任务就是 run() 方法 ...

  5. +load +initialize

    +load方法 在app启动的时候各个类的+load方法都会被调用,+load方法不是通过消息机制调用的,它是直接调用的,因此无论是在子类或者category中复写此方法,复写的+load方法都会被调 ...

  6. URL记录

    http://orchome.com/5https://www.cnblogs.com/haozhengfei/p/2192231596ceb2ac4c22294dbd25a1ca.htmlhttps ...

  7. Linux 循环创建多个线程

    这里说一下相关的基础知识: 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)     进程:独立地址空间,拥有PCB     线 ...

  8. java基础总结001

    1     sdf.parse()和sdf.format()它们两者的用法   http://www.imooc.com/wenda/detail/324671 3     Java String.s ...

  9. Rust语言学习笔记(7)

    模块 // 兄弟模块 mod network { fn connect() { } } mod client { fn connect() { } } // 父子模块 mod network { fn ...

  10. 【剑指offer】将字符串中的空格替换成"%20"

    #include <iostream> #include <string> using namespace std; char *ReplaceSpace(char *str, ...