数据结构与算法之美——散列表
1.1 散列思想 将数据以散列函数的方式(键值对)存储 1.2 散列函数 形如hash(key)的键值对函数叫散列函数,hash(key)是值,key是键。 1.3 散列函数设计的基本要求 散列函数计算值应该是非负整数 如果散列函数的键相等,则函数一定相等 如果键不相等,则值也一定不相等 但是在真实的情况下第三个条件很难满足,这种不满足的情况叫它 散列冲突 。 1.4 散列冲突的解决办法 散列冲突有两类解决办法:开放寻址法、链表法。 开放寻址法 开放寻址法的思想是如果出现了散列冲突,就向后探测空闲位置,将其插入。列举下比较简单的方法,比如: 线性探测法 。 删除操作不能直接将其值赋为null,否则会使寻址法失效,如果一定用的话,可以用个表示来标记要删除的元素,寻址时发现此标识就向后寻找。 其实,线性探测法有很多的问题,比如:当空闲的位置越来越少的时候,寻找时间越来越久,性能会下降很多,最坏的情况下会达到O(n)。除了线性探测,还有 二次探测 、 双重散列 等方法可以解决。 不过,不管哪一种方法,空闲位置不多时,性能都会下降很多。一般情况,都会使空闲位置与散列表的长度处于一个健康的比值,这个比值叫 装载因子 。 链表法 链表法是相比寻址法较好的解决散列冲突的解决办法。他会根据键值的不同来划分不同的‘桶’,每一个桶都会对应一条链表