您的位置:首页 > 其它

散列(Hash table)也称哈希表

2012-12-11 21:29 288 查看
一,与集合和字典的区别:

集合和字典(线性表,二叉搜索树,***L树,B树)中元素与关键码没有直接的对应的关系,

而哈希表中元素与关键码有对应的关系,而这层关系通过哈希函数桥接,通过关键码映射到表中某个地址位置来搜索元素的方法速率更高,比较次数很少。

二,散列

1.散列的性质:

.散列函数是一个压缩映像函数,关键码集合比散列表地址集合大得多。不同关键码的映射后必定会出现在同一个散列地址上,因而出现冲突。而处理冲突则必定降低搜索效率,所以能够造出一个地址分布均匀的散列尤为重要,也就是映射得到的地址出现的概率相等。



2.散列函数:

定义域包括需要存储的关键码,如果散列表允许有m个地址时,那么值域必须为0~m-1之间,散列函数算出来的地址值需要均匀分布在散列表里。



3.散列函数分类

a. 除留余数法。其中需要去一个不大于m的但又更接近于m的质数作为除数。

b. 数字分析法。

c. 平方取中法。

d.折叠法。



4.处理冲突的闭散列法:散列表有m个地址,将其改成m个桶,桶里的元素可以有多个,在一个桶里的关键码互为同义词。因为桶中的元素个数比较小,因而桶内大多采用顺序搜索。闭散列法限制桶中元素为一个,既可以看作为一个数组。处理冲突归结为如何寻找下一个空桶:

a. 线性探查法。如果是空桶,则直接插入新的元素;如果非空,则寻找顺序的寻找下一个空桶

两个概念必须明确:1.搜索成功的平均搜索长度,即为寻找到空桶的探索次数,每一次搜索成功至少一次搜索。

2.搜索不成功的平均搜索长度,以散列表的一个地址起,寻找到下一个空桶的查找次数,每个地址都得计算。

b. 二次探索法

c. 双散列法 。一个散列函数和一个冲突函数,一旦发生冲突,则需要用到冲突函数,两者函数值相加则是地址值,如果已然发生冲突,则再次使用冲突函数,直到得到的为空桶

优点:不是逐个向后寻找空桶,有利于避开“堆积”的产生,从而提高搜索的效率。

5. 处理冲突的开散列法

与闭散列法的区别:散列表中的桶中的元素可以为多个,桶中的元素通过单链表连接,称为同义词表。

优点:尽管涉及到指针的储存空间,但是闭散列法需要保持大量的空闲空间以保持搜索效率,如二次探查法要求装载因子不大于0.5.因而,综合考虑,开散列法更节省空间。

装载因子:α= 填入表中的元素个数 / 散列表的长度

 α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。



三,散列表实践效率分析

1.开散列发更优于闭散列法

2.散列函数中,除留余法优于其他散列函数,最差是折叠法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: