二、解决Hash冲突的主要方法 1、几个概念 (1)什么是hash表? 散列表(Hash table,也叫哈希表),是根据键值对直接进行访问的数据结构。它通过建立关键字和存储位置之间的一个确定的对应关系f,使得,每个关键字与结构中唯一一个存储位置相对应。这个对应关系f叫做哈希函数,存放记录的数组叫做哈希表。 (2)什么是冲突? 对于不同的关键字可能得到同一哈希地址,即key1 != key2,而f(key1)=f(key2),这种现象称冲突。 (3)如何处理冲突? 假设哈希表的地址集为0~(n-1),冲突是指由关键字得到的哈希地址为j(0<= j <=n-1)的位置上已存有记录,则"处理冲突"就是为该关键字的记录找到另一个"空"的hash地址。 2、处理冲突的几个方法 (1)开放定址法 Hi(key) = (H(key)+di) MOD m i=1,2,...,k(k<=m-1) 其中:H(key)为哈希函数;m为哈希表表长;di为增量序列 a、di=1,2,3,...,m-1,称线性探测再散列 b、二次探测再散列 c、di=伪随机数序列,称伪随机探测再散列 例:在长度为11的哈希表中已经填有关键字分别为17,60,29的记录(哈希函数H(key)=key MOD 11),现有第四个记录,其关键字为38,由哈希函数得到哈希地址为5,产生冲突。若用称线性探测再散列的方法处理时,得到下一个地址6仍冲突;下一个7仍冲突;直到哈希地址为8的位置为"空"为止,处理冲突的过程结束。 (2)再哈希法 Hi=RHi(key) i=1,2,…,k RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。 (3)链地址法 将所有关键字对应的值相同(同义词)的记录,存储在同一线性链表中。 (4)建立公共溢出区 所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。 Hi=RHi(key) i=1,2,…,k RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。 (3)链地址法 将所有关键字对应的值相同(同义词)的记录,存储在同一线性链表中。 (4)建立公共溢出区 所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。