在中国大学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号槽