散列表
散列表是一种基于数组按下标随机访问特性的数据结构。因此说散列表是数组的扩展,是由数组演变而来。
散列思想
用散列表存储数据使用的是散列思想。我们把需要存储到数组里面的元素称为键(key)或者关键字。把映射元素和存储位置的方法称为哈希函数,将哈希函数计算的值称为哈希值(散列值)。哈希值即映射后的数组下标。散列思想即将通过哈希函数建立关键字和其存储下标的映射关系。
散列冲突
散列冲突指不同关键字经过哈希函数后计算的哈希值相同:
key1 ≠ key2,但是hash(key1) = hash(key2)
如何构造散列函数
散列函数设计的基本要求:
1 散列函数计算得到的散列值是一个非负整数;
2 如果 key1 = key2,那 hash(key1) == hash(key2);
3 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。
业界著名的哈希算法
MD5 、CRC 、 SHA
如何避免散列冲突
常用的避免散列冲突的方法有开放定址法(open addressing)和链表法(chaining)
开放寻址法:开放寻址法的思想是如果出现了散列冲突,我们重新探测一个空闲地址。重新探测空闲地址一个简单的方法是线性探测(Linear probing)