第一章 基本原理
1.1 概述
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
1.2 基本概念
1.2.1简介
如图1-1,直接寻址存在一个技术问题:如果域U很大,在一台典型计算机的可用内存容量限制下,要在机器中存储大小为|U|的一张表F就不实际。
但实际储存的关键字集合K比所有可能的关键字域小,因此可以使用比F小的表T来存储数据,并将关键值集合使用散列函数映射到表T’中的槽存放。
图1-1
1.2.2哈希函数
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
哈希函数也可叫散列函数,一个好的散列函数应该满足简单一致散列的假设:所有元素通过散列函数处理后都被散列到任意一个槽。
1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数)
2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
3. 平方取中法:取关键字平方后的中间几位作为散列地址。
4. 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
5. 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。
6. 除法散列法: h(k) = k mod m
需要注意的是m= 2^p 时是糟糕的取值时,h(k)的值将会是k中的p个最低位数字.
7. 乘法散列法:
1.2.3碰撞冲突
但因为两个不同的键可能被散列函数映射到表T中同一个位置, 因此就会出现碰撞冲突。
1.2.4装载因子
给定一个存放n个元素,具有m个槽位的散列表,定义T的装载因子(load factor) a为 n/m, 即一个槽中存放的元素个数。
第二章 参考资料
2.1书籍
《introduction to algorithm》
《从头到尾彻底理解hash》
2.2网址
http://blog.csdn.net/zxycode007/article/details/6999984
MORE : IN BUILDING ...................