在中国大学MOOC(慕课)学习了北京大学陈斌老师的数据结构与算法(python版),以下是学习笔记。
散列表中有多个“槽”(slot),用来保存数据项,每个槽都有唯一的名称,通过散列函数,将数据项放入特定的槽中,想要查找该数据项只需查找其在对应的槽中是否存在。
例如:一个包含了11个槽的空散列表,槽名称分别对应0~10,数据项54,26,33,17,77,31,通过散列函数 h(item) = item % 11,将其填入对应槽中。在该组数据项中33,77对11求余都是0,这里就存在一个散列冲突问题。
一个好的散列函数需要具备:冲突最少、计算难度低、充分分散数据项。
能够把任意给定数据组的每一个项都映射到不同槽中的散列函数称为完美散列函数。实现完美散列函数的一种方法是扩大散列表容量,大到所有可能出现的项都能占据到不同的槽,显然这种方法太浪费空间,并不适用。
散列函数设计
散列函数设计的核心是:不能成为存储过程和查找过程的计算负担。
1.折叠法
将数据项按位分为若干段,再将几段数字相加,对散列表大小求余。
如:对电话号码62767255,两位两位的分成62 76 72 55四段,将四段相加再对散列表大小(11)求余。(62+76+72+55)%11 = 1,因此该电话号码62767255对应1号槽。
2.平方取中法
将数据项平方运算后,取中间2位数,对散列表大小求余。
如:对44进行散列:44² = 1936,中间两位数为93, h = 93%11 = 5,对应5号槽。
3.对于非数项,将其转化为ASCII数值
对于字符串,将每个字符用ord()获取其ASCII数值,再进行散列。这种方法对于变位

本文是关于数据结构与算法Python版的学习笔记,重点介绍了散列函数的设计,包括折叠法、平方取中法和非数项的ASCII转换。同时讨论了散列冲突的解决方案,如开放定址法(线性探测、再散列)和数据项链chaining。
最低0.47元/天 解锁文章
1700

被折叠的 条评论
为什么被折叠?



