散列表:线性探测-除留余数法 20251203
主要是记几个学习资料。
1. 关于散列表,线性探测 - 除留余数法。
考试时候很常见。装填因子/负载因子,也就是 “序列元素个数除以散列表长度”。为了不混淆散列表长和序列长度,后者统一称为“序列元素个数”,即序列中,有几个数字或字母,分子等于几。其中,散列表长度,又称“表长”,我理解为总的物理空格数量,总的物理坑位数,至少是划拨给到我可用的物理坑位数。做题的时候,如果是“除留余数法(X%K)”,会有个 X%K 的说法,怎么理解这个 K 呢?
我自己查了几个例题。K 可以取成序列元素个数,那么这样可以保证所有元素(键值对、数值、字母,或者各种……)都能放入物理坑位,当然,K 若取成某个大于序列长度的数字,这个时候,装填因子,应该是序列长度除以 K。K 相当于隐含着的、划拨给到你的团队的物理坑位数。
以下这篇文章被选入的原因,还有一个点,就是关于“平均查找长度(ASL)”的解释。ASL 习题看了好多遍,都没怎么懂。关于以下几个例题,可以这么总结:一是分子都是比对次数;二是查找成功 ASL 分母是“序列元素个数”,而查找失败 ASL 分母是通常为 K。
综合例题讲解,这个比较好理解。
【数据结构-查找】散列表 - 漫舞八月(Mount256) - 博客园 (文章1)
关于查找失败时候 ASL 如何计算?注意分母,除留余数法的【余数】。这篇文章还有个亮点,即平方项的查找次数确定。
散列表解决冲突的线性探测与平方探测查找成功、失败平均查找长度 - 东方紫 - 博客园 (文章4)
这道例题,对于分母就解释得更加清楚了!线性探测法-除留余数法。
散列表相关题目(线性探测再散列法)_线性探测再散列法例题-CSDN博客 (文章5)
2. 如果“除留余数法”的 K 小于 序列长度呢?
事实上,很多文章对于余数 K 是作出明确规定的,即小于等于表长,也就是保证所有的元素都能进入到物理区域;K 大于表长的情况,称为“溢出”。诸如这篇
【数据结构】散列表 - SaTsuki26681534 - 博客园 (文章2)
关键点在于, 余数 K 取法其实决定了比对次数(点击文章1,再次阅读)。不难发现,查找的时候,先假定坑位编号等于元素数值,比对不成功,依次右移,直至发现空着的坑位,表示该数值确实不在序列中。如果 K 没选好,就会导致这样的比对次数特别多。甚至,使得数值小的元素放入右边,数值大的元素放入左边,当然这种情况可以 通过排序来避免。参考文章
散列函数设计:除留余数法-百度开发者中心 (文章3)
3. 装填因子,怎么用?
有一说是“判断是否需要再压缩”。首先复习散列表的“初心”,主要是压缩空间,偶尔的冲突处理好,减少占用资源。辣魔,压缩过的数据,存储性能是否比原来好呢?空间足够嘛?需要扩容嘛?这时候,需要个指标,这个指标就是“装填因子”。
复习装填因子定义,即序列元素个数除以表长(可用物理坑位数)。假设,装填因子 90%,说明压缩得挺好;压缩完之后,装填因子 40%,说明压缩得不怎么样。例如,装填因子大于某个阈值,通常是 75%,就会决定扩容,即增加物理坑位数。 Needless to say, 扩容之前先要保证充分利用了资源。
HashMap之装载因子 - 楼兰胡杨 - 博客园 (文章6)
4. 链地址法:成功 ASL,失败 ASL 的算法
首先,“链地址法” 是一个链表数组,链表 Header 放入数组。其次,查找成功时候,按照“平行于数组的方向计算分子”+“层数编号✖节点数”。然后,查找失败时候,按照“平行于链表的方向计算分子”,即数节点数量。最后,分母计算方式;成功时“元素个数”,失败时“除留余数法的余数 K”。这两篇都是链地址法的两种 ASL 计算。
哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度 - 八英里 - 博客园 (文章7)
【数据结构-查找】散列表 - 漫舞八月(Mount256) - 博客园 (文章1)
ShoelessCai.com 致力于“商业赋能行业”
浙公网安备 33010602011771号