当初上数据结构的时候,就没怎么去过,唉。
查了下数据结构的书《数据结构——用C语言描述》作者:唐策善,李龙澍,黄刘生,P211
散列技术的基本思想是:
以节点的关键字 k 为自变量,通过一个确定的函数关系 f ,计算出对应的函数值 f(k),把这个值解释为节点的存储地址,将节点存入 f(k)所致的存储位置上。查找时再根据要查找的关键字用同样的函数计算地址,然后到相应的单元里去取要找的节点。用散列法存储的线性表叫散列表(Hash Table),上述的函数 f 称为散列函数,f(k)称为散列地址。
如果散列函数F 对于不相等的关键字key1和key2得到相同的散列地址(F(key1)=F(key2)),该现象称为冲突,发生冲突这两个关键字则称为该散列函数 F 的同义字。
然后说下我的理解。
在原则上来说,我们设计的散列函数 应该返回一个唯一 的值,这是散列表这种结构设计的初衷(不通过比较获得key所对应的地址),每个key对应一个唯一的地址,我拿到key就拿到了地址,不用通过比较就可以获得这个key所对应的值,这样效率是最高的。
但是,现实中,因为key的取值范围一般远远大于表空间的地址集(容量),所以 对于绝大多数 散列函数,产生冲突是在所难免的。
所以,通常散列函数是个多对一的函数,冲突是不可避免的。
因此,就有了处理冲突的方法。主要有两种方法:1 开放地址法 2 拉链法
java中用的就是拉链法。
拉链法解决冲突的做法是:将所有关键字为同义词的节点连接在同一个单链表中。 |