00 写在前面
平衡二叉搜索树中的RB-tree作为一种效率表现和复杂度很平衡的结构,一直被用作STL set和map的底层支持。
【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究
【STL源码剖析】总结笔记(9):set/multiset与map/multimap
而还有一种结构,哈希表(以下称hashtable),在数据具有足够的随机性时,也能够保持在插入删除等操作上的“常数平均时间”表现。也是unordered结构的基础。
hashtable更多的是经验设计
01 概述
hashtable是非常常见的数据结构,大家在数据结构课程中也有接触。hash table是一种字典结构。
假设我们有一大堆元素要存入数组,那么可以构造一个简单的array便可以实现。
但是当数据量变大时,需要申请巨大的空间可能不太现实,这个时候就要考虑另一种存储方式了。
映射函数是一种方法,将大数映射为小数。
如果数组长度为tablesize,那么x%tablesize得到的数可以作为这个数x的索引。
解决碰撞
这种hash function会有一个问题,就是在元素增多时会不可避免地出现多个元素映射到同一个位置的情况。这种情况也叫做“碰撞”。常用的解决碰撞的方法有以下几种:
-
线性探测
当使用hash function计算出位置后发现该位置已经没有空间时,会继续向下一一寻找可以放入元素的位置。如果到达尾部就再从头开始。
这个方法简单易懂,但也有一个很直观的问题:在很多空位都被占用后,就会出现一个新元素疯狂撞墙最后才插入成功的现象,增加了平均插入成本。
-
二次探测
二次探测说的是,既然一个一个的探测会出现问题,那么就以二次方的形式探测。原来是h+1,h+2…现在就变为h+(1的平方),h+(2的平方)…
很明