散列(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.散列函数中,除留余法优于其他散列函数,最差是折叠法
集合和字典(线性表,二叉搜索树,***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.散列函数中,除留余法优于其他散列函数,最差是折叠法
相关文章推荐
- 算法导论之散列表(哈希表)详解(hash table)
- 散列表 (Hash table,也叫哈希表)
- 哈希表(散列)HashTable实现
- 散列表查询(哈希表)之散列函数的构造方法
- 【每日算法】哈希表(Hash Table)
- 数据结构——线性表——散列存储结构——哈希表知识点总结 原创 2017年05月14日 10:08:40 散列(hashing)是一种重要的存储方法,也是一种常见的查找方法。 基本思想:以结点的
- HashSet、HashMap,散列表数据结构(哈希表)
- PHP Perl 关联数组 哈希表 Hash Table
- 哈希表(散列)HashTable实现
- 【哈希表】线性探测再散列的相关知识与计算
- 散列表查询(哈希表)之散列函数的构造方法
- 数据结构—散列表(Hash table,也叫哈希表)
- 散列(hash table)
- hash table 哈希表(散列表)
- Hash Table 哈希表 C++ 例子
- 《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表(散列)的阐述和解释 》
- C++数据结构 之 哈希表(散列表)_Hash Table
- 【数据结构】通讯录查询系统的设计与实现(散列表(哈希表))
- hashset、hashmap、散列表数据结构(哈希表)它们之间的联系
- 一个简单的哈希表(线性探测再散列)