查找与散列(Hash)

来源:互联网 发布:熊猫计划软件免费版 编辑:程序博客网 时间:2024/06/05 06:25

查找与散列(Hash)

1.查找的一些概念

查找——在给定集合中查找特定的元素。

在查找的过程中,查找的长度是指关键字间的比较次数,而平均查找长度则是数学上的期望:ASL=P1*C1+P2*C2+...+Pn*Cn。 Pi为查找第i个元素的概率,Ci为查找第i个元素所需的查找长度。一般认为每个元素查找概率相同。平均查找长度分为查找成功和查找不成功长度两种。

对于顺序查找来说。ASL(成功)=(1+2+...+n)*1/n=(n+1)/2;ASL(不成功)=n。

折半查找的查找过程可以用判定树来描述。

ASL(成功)=int[log(2)(n)]+1。

微笑例题:【2010研招】已知一个长度为16的顺序表L,其元素有序,若采用折半查找去查找一个不存在的元素,则关键字的比较次数最多是(5次)

答:具有n个结点的判定树高度为int[log(2)(n)]+1。所以最多比较5次。

 

2.散列表(Hash)

散列:把元素的内容与元素的存储地址关联起来,提高查找效率。

散列函数:实现从元素值到存储地址的映射。

散列表:记录元素值到存储地址的映射。

常用散列函数:

1.直接定址法:H(key)=a*key+b。

2.除留余数法:H(key)=key mod b。

处理冲突的方法:

1.拉链法——把所有同义词存储在一个链表中。

2.线性探测法——冲突发生时,查找该冲突位置后面的单元,遇到空单元时把地址填进去。

散列表的查找效率取决于三个因素:散列函、冲突处理方法和填装因子。

填装因子=元素数目/散列表长度。填装因子越大,散列表越满,发生冲突的可能性就大。

微笑例题:【2010研招】将关键字序列(7,8,30,11,18,9,14)7个元素散列存储到散列表中。散列表的存储空间是下标从0开始的一维数组,散列函数为H(key)=key*3 mod 7。处理冲突的方法为线性探测再散列法,填充因子为0.7。

1)请画出散列表;

2)分别计算等概率情况下,查找成功和查找不成功的平均查找长度。

引申:

他人blog——从头到尾彻底解析Hash 表算法

http://blog.csdn.net/v_july_v/article/details/6256463

1 0
原创粉丝点击