【STL源码剖析】总结笔记(10):哈希表(hashtable)探究

00 写在前面

平衡二叉搜索树中的RB-tree作为一种效率表现和复杂度很平衡的结构,一直被用作STL set和map的底层支持。
【STL源码剖析】总结笔记(8):红黑树(RB-tree)探究
【STL源码剖析】总结笔记(9):set/multiset与map/multimap

而还有一种结构,哈希表(以下称hashtable),在数据具有足够的随机性时,也能够保持在插入删除等操作上的“常数平均时间”表现。也是unordered结构的基础。

hashtable更多的是经验设计

01 概述

hashtable是非常常见的数据结构,大家在数据结构课程中也有接触。hash table是一种字典结构。

假设我们有一大堆元素要存入数组,那么可以构造一个简单的array便可以实现。

但是当数据量变大时,需要申请巨大的空间可能不太现实,这个时候就要考虑另一种存储方式了。

映射函数是一种方法,将大数映射为小数。

PNG图像 31

如果数组长度为tablesize,那么x%tablesize得到的数可以作为这个数x的索引。

解决碰撞

这种hash function会有一个问题,就是在元素增多时会不可避免地出现多个元素映射到同一个位置的情况。这种情况也叫做“碰撞”。常用的解决碰撞的方法有以下几种:

  1. 线性探测

    当使用hash function计算出位置后发现该位置已经没有空间时,会继续向下一一寻找可以放入元素的位置。如果到达尾部就再从头开始。

    这个方法简单易懂,但也有一个很直观的问题:在很多空位都被占用后,就会出现一个新元素疯狂撞墙最后才插入成功的现象,增加了平均插入成本。

  2. 二次探测

    二次探测说的是,既然一个一个的探测会出现问题,那么就以二次方的形式探测。原来是h+1,h+2…现在就变为h+(1的平方),h+(2的平方)…

    很明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值