重温《STL源码剖析》笔记 第五章
源码之前,了无秘密 ——侯杰
序列式容器 关联式容器
array(build in) RB-tree
vector set
heap map
priority-queue multiset
list multimap
slist hashtable
deque hash_set
stack(配接器) hash_map
queue(配接器) hash_multiset
hash_multimap
第五章:关联式容器
定义:所谓关联式容器,观念上类似关联式数据库,每个元素都有一个键值(可以)和一个实值(value)
关联式容器没有头尾,只有最大元素和最小元素
树中根节点至任一节点的路径长度,即所谓该节点的深度。而根节点的深度永远是0,叶子节点的高度永远
也是0(但是又有版本《数据结构与算法分析--c语言描述》、《大话数据结构》中定义的根节点深度是1,
叶子节点的高度也是1)。各执一词,瞬间不淡定了。
二叉搜索数,可提供对数时间的元素插入和访问。二叉搜索树的查找时很容易的,但是插入和移除麻烦
点,如果删除的节点有左右子节点,则将右子树的最小节点取得需要删除的节点。
平衡二叉搜索树:
AVL Tree:任何节点的左右子树高度相差最多1
RB-tree(红黑树):一颗特殊的二叉搜索树
必须满足:1.每个节点要么是红要么是黑
2.根节点必须是黑色的
3.如果节点为红,其子节点必须为黑
4.任一节点至NULL(树尾端)的任何路径,所含之黑节点数必须相同。
其他关于树和红黑树请查看另一篇博客: 树
set:所有的元素都会根据元素的键值自动被排序,set元素的键值就是实值,实值就是键值。
set不允许两个元素有相同的键值。
不可以通过set的迭代器改变set的元素值,因为set的元素值就是其键值,关系到set
元素的排序规则,如果任意改变set元素值,会严重破坏set组织。
set以RB-tree为底层机制,几乎所有的set操作都只是转调用RB-tree的操作行为。
map:
map的所有元素都是pair,同时拥有实值和键值。pair的第一元素被视为键值,第二元素被
视为实值。map也不允许两个元素拥有相同的键值。
map以RB-tree为底层机制,几乎所有的mapt操作都只是转调用RB-tree的操作行为。
multiset:
multiset的特性以及用法和set完全相同,唯一的差别在于它允许键值重复,因此它的
插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()
multimap:
multimap的特性以及用法和map完全相同,唯一的差别在于它允许键值重复,因此它的
插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()
hashtable
二叉搜索树具有对数时间的表现,但这样的表现是基于一个输入数据有足够的随机性。而
hashtable(散列表)的数据结构,在插入,删除,搜寻等操作上也具有常数平均时间的表现。
使用hash function 会导致可能有不同的元素被映射到相同的位置(亦具有相同的索引)
导致了碰撞问题。
解决碰撞问题的方法有很多种:线性探测,二次探测,开链(STL使用)
线性探测:容易导致主集团(primary clustering)的产生 (H+1,H+2,,,,H+i)
对于碰撞一般采取的措施是如果计算出来的位置上已经有元素值了则
循序往下一一寻找,直到没有元素为止。而进行元素搜寻时,如果计算出来的位置
上的元素值与我们的搜寻目标不符,就循序向下一一寻找,直到找到吻合值,或者
直到遇上空格元素。而元素的删除则必须采用惰性删除,只标记删除几号,实际删
除操作则待表格重新整理时再进行。(主要是因为hash table中的每一个元素不仅
表述它自己,也关系到其他元素的安排。
二次探测:(主要用来解决主集团的问题)(H+1^2,H+2^2,,,,H+i^2)
表格负载:假设表格的大小为质数,而且永远保持负载系数在0.5一下(也就是说超过
0.5就重新配置并重新整理表格),那么就可以确定每插入一个新元素所需要的
探测次数不多于2。
表容量28个质数{53、97、193、389、769、1543、3079、6151...}
Hi=H0 + i^2(mod M)
H(i-1)=H0 + (i - 1)^2(Mod M)
整理可得:
Hi=H(i-1) + 2i -1(Mod M)
开链法:在每一个表格元素中维护一个list;hash function 为我们分配某一个list
然后在list上执行元素的插入,搜寻,删除等操作。
开链法的表格重建与否的判断原则是:元素个数(包括新增元素)和bucket
vector的大小来比。如果前者大于后者,就重建表格。
hash_set:几乎所有的操作行为都是转调用hasht_table的操作工作。
RB-tree有自动排序功能而hashtable没有,反应出来的结果就是,
set的元素有自动排序功能而hash_set没有。
hash_map:
RB-tree有自动排序功能而hashtable没有,反应出来的结果就是,
set的元素有自动排序功能而hash_map没有。
hash_multiset:
与multiset完全相同,唯一的差别就是他的底层机制是hashtable,
因此hash_multiset的元素不会自动排序。
而hash_multiset与hash_set实现的唯一的差别在于,前者元素插入操作
采用底层机制hashtable的insert_equal(),后者则是采用insert_unique()
hash_multimap:
与multimap完全相同,唯一的差别就是他的底层机制是hashtable,
因此hash_multimap的元素不会自动排序。
而hash_multimap与hash_map实现的唯一的差别在于,前者元素插入操作
采用底层机制hashtable的insert_equal(),后者则是采用insert_unique()
重温《STL源码剖析》笔记 第五章的更多相关文章
- 《STL源码剖析》——第五、六:关联容器与算法
第五章.关联容器 5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...
- 《STL源码剖析》——第四章、序列容器
1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...
- STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
- c++ stl源码剖析学习笔记(一)uninitialized_copy()函数
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
- 通读《STL源码剖析》之后的一点读书笔记
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- 面试题总结(三)、《STL源码剖析》相关面试题总结
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- STL"源码"剖析
STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...
随机推荐
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- Java中Set的contains()方法
Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...
- 9.2.2、Libgdx的输入处理之事件处理
(官网:www.libgdx.cn) 事件处理可以更加准确的获取用户的输入.事件处理提供了一种可以通过用户接口进行交互的方法.比如按下.释放一个按钮. 输入处理 事件处理通过观察者模式来完成.首先,需 ...
- 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画
1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...
- android 优化之布局优化
布局优化的思路很简单,尽量减少布局文件的层级,看过系统源码的都知道,Android view绘制都是逐层绘制的,所以布局的层级少了,decodeview的时候绘制工作自然就少了. 那么如何进行布局的优 ...
- FSM之SMC使用总结
FSM之SMC使用总结 Part1: Smc.jar state machine compiler usage Reference: http://smc.sourceforge.net/ ...
- 测试access函数
测试程序: 测试结果: chown root access.out 将用户ID改为root chmod u+s access.out 打开 set-user-ID位
- PS图层混合算法之三(滤色, 叠加, 柔光, 强光)
滤色模式: 作用结果和正片叠底刚好相反,它是将两个颜色的互补色的像素值相乘,然后除以255得到的最终色的像素值.通常执行滤色模式后的颜色都较浅.任何颜色和黑色执行滤色,原色不受影响;任何颜色和白色执行 ...
- 【Android 应用开发】BluetoothAdapter解析
这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...
- 开源组件photoView学习
功能特性 支持放缩超出边界,多点触控和双击事件 滚动和滑动 和ViewPager等能完美兼容 矩阵变化等有回调,方便前台其他展示的改变 单击,长按都有回调提醒 源码剖析 那么怎么来学习他的源码呢,我们 ...