散列表(Hash table)及其构造
散列表(Hash table)
散列表,是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
已知的查找方法:
1.顺序查找 O(N)
2.二分查找(静态查找) O(log2N)
3.二叉搜索树 O(h) h为二叉树的高度
平衡二叉树 O(log2N)
Q:如何快速搜索到需要的关键字?如果关键字不方便比较怎么办?
查找的本质:已知对象找位置
有序安排对象:全序、半序
直接“算出”对象位置:散列
散列查找的两项基本工作:
计算位置:构造散列函数确定关键词的存储位置
解决冲突:应用某种策略解决多个关键词位置相同的情况
时间复杂度几乎是常量O(1) 查找时间与问题规模无关
关键操作:查找 插入 删除
散列(Hashing)的基本思想:
1.以关键词key为自变量,通过一个确定的函数h(散列函数)计算出对应的函数值h(key),作为数据对象的存储地址。
2.可能不同的关键词会映射到同一个散列地址上,即h(keyi) = h(keyj) (当keyi≠keyj),称为”冲突(Collision)”。需要某种冲突解决策略
装填因子(Loading Factor):
设散列表空间大小为m, 填入表中元素的个数时n, 则称α = n/m为散列表的装填因子
散列函数的构造方法:
一个“好”的散列函数一般考虑下列两个因素:
1.计算简单,以便提高转换速度
2.关键词对应的地址空间分布均匀,以尽量减少冲突
数字关键词的构造
1.直接定址法
取关键词的某个线性函数值为散列地址
h(key) = a * key + b (a, b为常数)
如:h(key) = key - 1990

2.除留余数法
h(key) = key mod P
如 h(key) = key % 17 P = Tablesize = 17

一般P取素数
3.数字分析法
分析数字关键字在各位上的变化情况,取比较随机的为作为散列地址
如取11位手机号码key的后4为作为地址: h(key) = atoi(key+7) (char *key)
如果关键词key是18位身份证号码:

h1 (key) = (key[6]-‘0’)*104 + (key[10]-‘0’)*103 + (key[14]-‘0’)*102 + (key[16]-‘0’)*10 + (key[17]-‘0’)
h(key) = h1 (key)*10 + 10 (当 key[18] = ‘x’时)
或 = h1 (key)*10 + key[18]-‘0’ (当 key[18] 为’0’~’9’时)
4.折叠法:
把关键词分割成位数相同的几个部分,然后叠加

5.平方取中法:

尽量使每一位都对最终结果产生影响
字符关键词的散列函数构造
1.简单的散列函数—ASCⅡ码加和法
h(key) = (Σkey[i]) mod TableSize
冲突严重 如a3, b2, c1, eat, tea
2.简单的改进—前3个字符移位法
h(key)=(key[0]*272 + key[1]*27 + key[2])mod TableSize
27 可能有空格
仍然冲突:string street strong structure.. 并且空间浪费 3000/pow(26, 3) = 30%
3.好的散列函数—移位法
设计关键词的所以n个字符,并且分布很好:

如:h(“abcde”)=‘a’*324+’b’*323+’c’*322+’d’*32+’e’
Index Hash( const char *key, int TableSize )
{
unsigned int h = ;
while (*key != '\0')
h = (h << ) + *key++;
return h % TableSize;
}
散列表(Hash table)及其构造的更多相关文章
- [转载] 散列表(Hash Table)从理论到实用(上)
转载自:白话算法(6) 散列表(Hash Table)从理论到实用(上) 处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通 ...
- [转载] 散列表(Hash Table)从理论到实用(中)
转载自:白话算法(6) 散列表(Hash Table)从理论到实用(中) 不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好 ...
- [转载] 散列表(Hash Table) 从理论到实用(下)
转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...
- Java 集合 散列表hash table
Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...
- 散列表(Hash Table)
散列表(hash table): 也称为哈希表. 根据wikipedia的定义:是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...
- 白话算法(6) 散列表(Hash Table)从理论到实用(中)
不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...
- 白话算法(6) 散列表(Hash Table)从理论到实用(上)
处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通过一般化的推理来论证理解,并可归纳成一般公式,而这个一般公式适用于任何特殊 ...
随机推荐
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- 我的Android进阶之旅------>温习Sqlite3的常用操作
前言;今天要写一个应用来调节系统的Brightness值,来改变系统的背光亮度.由于刚开始些的时候没有考虑Brightness的最小值,直接托动SeekBar到最小值(为0).瞬间,屏幕变成全黑,失败 ...
- Shell parameter expansion
使用sh写一些小型的脚本会使工作更加简单.有部分内容可能大家都比較陌生(至少我是这样). 就是变量有关的參数展开,以下就是一些简单的描写叙述和使用方法.能够使代码更加简洁 展开运算符 替换运算 ${v ...
- BZOJ 4523 [Cqoi2016]路由表 Trie树
Trie树的应用题目. 在线建立一棵01 Trie树,然后按照要求用询问在上面跑,用单调栈维护答案即可. #include<iostream> #include<cstdio> ...
- codeforces 112B Petya and Square
B. Petya and Square time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Cocos2d-x中单例的使用
大家都知道一个程序中只有一个导演类,eg: CCDirector *pDirectory = CCDirector::sharedDirector();//初始化导演类. 可通过 pDirectory ...
- js正则表达式(2)
找到以某个字符串开头的字符串 var myReg=/^(abc)/gim; 如果不加m,那么只找一行,而加了m可以找到每行中以该字符串开头的匹配文本. 如: abcsfsdfasd7890hklfah ...
- Lucene默认的打分算法——ES默认
改变Lucene的打分模型 随着Apache Lucene 4.0版本在2012年的发布,这款伟大的全文检索工具包终于允许用户修改默认的基于TF/IDF原理的打分算法.Lucene API变得更加容易 ...
- 机器视觉 Histogram of oriented gradients
Histogram of oriented gradients 简称 HoG, 是计算机视觉和图像处理领域一种非常重要的特征,被广泛地应用于物体检测,人脸检测,人脸表情检测等. HoG 最早是在200 ...
- 集训Day3
被疯狂造谣+请家长 但生活还得继续 ...今天的题口胡一下吧明天码 PKUSC2018 D1T1 对于x:若x不翻,则x的一半到x的数都不能翻 若x翻,则x到2x都得翻 剩下随便安排 排列组合一下 P ...