基本定义
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字key对应一个存储位置f(key)。
这种对应关系f称为散列或哈希函数采用上述思想将数据存储在一块连续的存储空间中,这块连续的存储空间称为散列或哈希表
关键字对应的存储位置称为散列地址
如果碰到两个不同的关键字key1≠key2,但却有相同的f(key1)=f(key2),这种现象称为冲突,
并把key1和key2 称为这个散列函数的同义词(synonym)
散列函数构造方法
好的散列函数参考如下两个原则:
- 计算简单
- 散列地址分布均匀
最常用的方法是除留余数法,对于散列表长度为m的散列函数是 f(key)=key mod p (p≤m)
处理散列冲突
开放地址法
开放地址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列表总能找到,并存入。
开放地址法又分为线性探测法,二次探测法和随机探测法。链地址法
将所有同义词的关键字存储在同一个单链表中,称这个单链表为同义词子表,在散列表中只存储同义词子表的头指针。
只要有冲突,就在同义词的子表中增加结点。(java中的HashMap就是采用这种方法)