散列表和数组有一个相同的特性——按下标随机访问。散列表是数组的一种扩展,由数组演化而来。
散列表的下标叫键(key)或关键字。通过散列函数(也叫哈希函数、hash函数)把键转化为元素,得到的结果叫散列值(value)(也叫哈希值、hash值)。
hash(key)==>value
散列函数基本设计要求
- 散列函数计算得到的散列值为非负整数。因为散列值用来作为下标随机访问散列表。
- 若key1 = key2,则hash(key1) = hash(key2)
- 若key1 != key2,则hash(key1) != hash(key2)。实际上,达成这个条件几乎不可能,午饭避免因为散列值的数值范围有限(如:1到2^32)造成的散列冲突问题。如果达成这个条件,那么计算散列值要特别的大,则计算散列耗时太多不值得。
散列冲突问题解决
负载因子=散列值个数/散列表容量,负载因子大小和散列冲突数量成正比。
解决方法分2类:开放寻址法、链表法。
- 开放寻址法:
思想: 若出现散列冲突,则重新探测一个空间位置。
重新探测方式有:线性探测(即探测散列冲突出现位置的下面第一个空间位置有没有散列值)、二次探测&