散列(Hash table)也称哈希表
来源:互联网 发布:切歌软件 编辑:程序博客网 时间:2024/06/05 08:54
一,与集合和字典的区别:
集合和字典(线性表,二叉搜索树,AVL树,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)
- 散列:散列函数与散列表(hash table)
- 散列(hash)
- 散列(hash)
- 散列表(hash table)
- 散列表(Hash table)
- 散列(Hash)目录
- hash(哈希,散列)
- 散列(Hash)基础知识
- Hash(散列函数)
- 算法导论---------------散列表(hash table)
- 哈希表(散列表 Hash Table)
- hash table 哈希表(散列表)
- (原创)散列表 hash table
- 散列表(Hash Table)
- 散列表 hash table
- 散列表 - Hash Table
- horizon源码阅读
- Mysql主主复制故障自动切换解决方案
- 工厂模式
- 收集学习asp.net比较完整开发的流程
- hdu 1862
- 散列(Hash table)也称哈希表
- 如何在程序中判断VS的版本?
- 在中国,安卓帮不上谷歌
- C++ 对象的内存布局(下)
- Is Your Data Center Ready for Cyber Monday?
- 堆
- 永远不要对一个外行聊你的专业
- 请教Android开发中的Adapter内的onItemClick监听器四个arg参数问题
- SQLite的SQL语法