散列函数

141 阅读2分钟

如何设计散列函数?

散列函数设计的好坏,决定了散列表冲突的概率大小,也直接决定了散列表的性能。

那什么才是好的散列函数呢?

首先,散列函数的设计不能太复杂。

过于复杂的散列函数,势必会消耗很多计算时间,也就间接地影响到散列表的性能。

其次,散列函数生成的值要尽可能随机并且均匀分布,这样才能避免或者最小化散列冲突,而且即便出现冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽内数据特别多的情况。

实际工作中,我们还需要综合考虑各种因素。这些因素有关键字的长度、特点、分布、还有散列表的大小等。

散列函数各式各样,举几个常用的、简单的散列函数的设计方法,有个直观的感受。

第一个例子学生运动会的例子,通过分析参赛编号的特征,把编号中的后两位作为散列值。还可以用类似的散列函数处理手机号码,因为手机号码前几位重复的可能性很大,但是后面几位就比较随机,我们可以取手机号的后四位作为散列值。这种散列函数的设计方法,我们一般叫做“数据分析法”。

第二个例子如何实现 Word 拼写检查功能。这里面的散列函数,我们就可以这样设计:将单词中每个字母的ASCll 码值“进位”相加,然后再跟散列表的大小求余、取模,作为散列值。比如,英文单词 nice,我们转化出来的散列值就是下面这样:

hash("nice")=(("n" - "a") * 26*26*26 + ("i" - "a")*26*26 + ("c" - "a")*26+ ("e"-"a")) / 78978

学习:极客时间《数据结构与算法之美》学习笔记