【算法】 排列hash 变进制数 的理解 《Hash函数的设计优化》 李羽修

前言

如标题,学习内容来自《Hash函数的设计优化》-李羽修
论文开头为
论文


写这篇博客的原因只是因为发现本智障在这个部分停留很久,也希望能对他人有所帮助


正文

关于变进制数

我觉得首先应理解变进制数是什么
一般所说的k进制数都是在每一位上逢k进一,每一位上的进制都是一样的,有人称为“常数进制”。
而变进制数是这种数的延伸,每一位上的进制都是给出的一个数ai,只在这一位上逢ai进一
有兴趣的可以自证一下这种数是可以不矛盾地进位的
理解它的最好方式就是手动模拟一个变进制数与十进制数转化的过程
现在我们有变进制数n=121 , 每一位进制为a3=5,a2=4,a1=3 (下标从右向左数)
那么先考虑第2位的1被进位而来是因为有3,第3位的1被进位而来是因为有4个第二位
则转化为10进制数即为 34+32+1=19
十进制数19转化为该进制组下的变进制数为
第三位为19 / (3 * 4) = 1
第二位为19 mod (3 * 4) / 3 = 2
第一位为19 mod (3 * 4) mod 3 = 1

可以被一一对应的原因

理解了变进制数的表示 ,需要知道可以被一一对应的原因
而论文中有详细讲解,我说些我觉得可以注意的地方
首先是p11=(p1)pn1+(p1)pn2++(p1)
一开始没想明白式子的正确性证明,结合之前写的这篇博客 的例7,觉得可以将这个式子放在p进制下看,等式左边是最大值,右边看作p进制的每一位最大值相加(类比 (2 << 6) + (2 << 16)),就很显然了。大不了最后再转回十进制。
其它部分应该跟着论文来就没问题

也许会有的疑问

至少对我来说,觉得奇怪的是作者在将全排列和更一般的排列与自然数对应的具体方法时,所说的像是突然冒出来的一样。

一

二

为什么要这样?
后来发现其实这样只是为了保证这样转化是保证每一位都满足变进制数要求(个数一定不是负数,结果小于n诸如此类),且这样转化是唯一结果(没有证明,但应该是如此)
所以其实也许我们也可以在了解一一对应及变进制数后自己设计同样“保证每一位都满足变进制数要求,且这样转化是唯一结果”的方法,也可以达到效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章