Java查找算法(五): 散列表查找

[ 什么是散列表查找 ] 

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)

这个对应关系f()称为散列函数或哈希函数。

采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表,那么关键字对应的记录存储位置我们称为散列地址。


[ 散列技术的优缺点 ] 

使用散列技术,对于查找来书,简化了比较过程,效率会大大提高

但是散列技术不适合一个关键字对应多条记录的情况,如通过“男”查找班级里所有男生。

散列技术需要解决的另一个问题就是冲突:如k1 != k2, 但是f(k1) == f(k2), 这种现象我们称为冲突,并把k1和k2称为散列函数的同义词。


[ 散列函数构造方法 ] 

1. 直接定址法:

2. 数字分析法:

3. 平方取中法:

4. 折叠法:

5. 除留余数法:

6. 随机数法:


[ 处理散列冲突的方法 ] 

1. 开放地址法:

2. 再散列函数法:

3. 链地址法:

4. 公共溢出区法:


[ 散列表查找实现 ] 

具体程序请查看HashMap,HashSet,Hashtable

当从HashSet集合中查找某个对象时,java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到对应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals方法比较,这样就不用遍历集合中的所有元素就可以得到结论,可见HashSet集合具有很好的对象检索性能。

http://blog.chinaunix.net/uid-26981819-id-4462638.html 源码分析


[ 散列表查找性能分析 ] 

如果没有冲突,散列查找是所有查找中效率最高的,因为它的时间复杂度为O(1), 可惜没有冲突的散列只是一种理想情况。





你可能感兴趣的:(数据结构)