【算法】 排列hash 变进制数 的理解 《Hash函数的设计优化》 李羽修
2017-08-13 11:16
369 查看
前言
如标题,学习内容来自《Hash函数的设计优化》-李羽修论文开头为
写这篇博客的原因只是因为发现本智障在这个部分停留很久,也希望能对他人有所帮助
正文
关于变进制数
我觉得首先应理解变进制数是什么一般所说的k进制数都是在每一位上逢k进一,每一位上的进制都是一样的,有人称为“常数进制”。
而变进制数是这种数的延伸,每一位上的进制都是给出的一个数ai,只在这一位上逢ai进一
有兴趣的可以自证一下这种数是可以不矛盾地进位的
理解它的最好方式就是手动模拟一个变进制数与十进制数转化的过程
现在我们有变进制数n=121, 每一位进制为a3=5,a2=4,a1=3 (下标从右向左数)
那么先考虑第2位的1被进位而来是因为有3,第3位的1被进位而来是因为有4个第二位
则转化为10进制数即为 3∗4+3∗2+1=19
十进制数19转化为该进制组下的变进制数为
第三位为19 / (3 * 4) = 1
第二位为19 mod (3 * 4) / 3 = 2
第一位为19 mod (3 * 4) mod 3 = 1
可以被一一对应的原因
理解了变进制数的表示 ,需要知道可以被一一对应的原因而论文中有详细讲解,我说些我觉得可以注意的地方
首先是p1−1=(p−1)pn−1+(p−1)pn−2+⋯+(p−1)。
一开始没想明白式子的正确性证明,结合之前写的这篇博客 的例7,觉得可以将这个式子放在p进制下看,等式左边是最大值,右边看作p进制的每一位最大值相加(类比 (2 << 6) + (2 << 16)),就很显然了。大不了最后再转回十进制。
其它部分应该跟着论文来就没问题
也许会有的疑问
至少对我来说,觉得奇怪的是作者在将全排列和更一般的排列与自然数对应的具体方法时,所说的像是突然冒出来的一样。为什么要这样?
后来发现其实这样只是为了保证这样转化是保证每一位都满足变进制数要求(个数一定不是负数,结果小于n诸如此类),且这样转化是唯一结果(没有证明,但应该是如此)
所以其实也许我们也可以在了解一一对应及变进制数后自己设计同样“保证每一位都满足变进制数要求,且这样转化是唯一结果”的方法,也可以达到效果
相关文章推荐
- 【算法】 排列hash 变进制数 的理解 《Hash函数的设计优化》 李羽修
- 【算法】 排列hash 变进制数 的理解 《Hash函数的设计优化》 李羽修
- [Notes] 摘《李羽修--Hash函数的设计优化》
- “金箍咒”我的全排列组合算法设计演化之四优化算法与补充
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 算法设计步步高:1.入手从最容易想到的分析开始写代码 2.分析补缺 3.补漏及完善 4.稍事优化
- 算法设计与优化编程 第十讲 Subway
- 【项目】优化算法设计(一):《遗传算法与工程优化》相关部分内容
- 再谈脏字过滤(基于hash的优化算法)
- 算法的设计基本方法的理解
- 【算法分析与设计】全排列问题
- 【算法复习三】算法设计技巧与优化----算法设计技巧
- 集训第四周(高效算法设计)N题 (二分查找优化题)
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 我理解的剑指offer----字符串的全排列和组合算法
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- 谈谈对一些软件架构设计箴言的理解 对软件的过早地优化是万恶的根源 反设计模式案例简介
- 公交车路线查询系统后台数据库设计--换乘算法改进与优化