散列表(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)及其构造的更多相关文章

  1. [转载] 散列表(Hash Table)从理论到实用(上)

    转载自:白话算法(6) 散列表(Hash Table)从理论到实用(上) 处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通 ...

  2. [转载] 散列表(Hash Table)从理论到实用(中)

    转载自:白话算法(6) 散列表(Hash Table)从理论到实用(中) 不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好 ...

  3. [转载] 散列表(Hash Table) 从理论到实用(下)

    转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...

  4. Java 集合 散列表hash table

    Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...

  5. 散列表(Hash Table)

    散列表(hash table): 也称为哈希表. 根据wikipedia的定义:是根据关键字(Key value)而直接访问在内存存储位置的数据结构.也就是说,它通过把键值通过一个函数的计算,映射到表 ...

  6. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  7. 算法导论-散列表(Hash Table)-大量数据快速查找算法

    目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...

  8. 白话算法(6) 散列表(Hash Table)从理论到实用(中)

    不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...

  9. 白话算法(6) 散列表(Hash Table)从理论到实用(上)

    处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通过一般化的推理来论证理解,并可归纳成一般公式,而这个一般公式适用于任何特殊 ...

随机推荐

  1. python cookbook第三版学习笔记四:文本以及字符串令牌解析

    文本处理: 假设你存在一个目录,下面存在各种形式的文件,有txt,csv等等.如果你只想找到其中一种或多种格式的文件并打开该如何办呢.首先肯定是要找到满足条件的文件,然后进行路径合并在一一打开. pa ...

  2. Nginx报出504 Gateway Timeout错误2

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误 经观察,发现大约30秒时超时,php.ini中执行时间配置已经是300秒: 复制代码 ...

  3. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

  4. android 电池(一):锂电池基本原理篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8497830 关键词:Android  电池关机充电 androidboot.mode ...

  5. Git 使用初步

    官网:https://git-scm.com/ 官方文档:https://git-scm.com/doc 比较简略的资料(对基本概念没有解释很清楚):http://wenku.baidu.com/li ...

  6. html5--1.10绝对路径和相对路径

    html5--1.10绝对路径和相对路径 学习要点: 绝对路径和相对路径 1.绝对路径 需要指出链接资源的绝对位置,与你的HTML文档的位置无关: 1. 服务器中的位置:href="http ...

  7. 使用Tornado作为Django App的服务器

    闲来无事,折腾折腾. 老是听说tonado是个异步web框架和服务器,作为框架倒是了解到了,但是服务器一直不太懂.所以决定了解一下,既然可以做服务器,那就把自己的django app部署到这上边去. ...

  8. 使用ubuntu自带的Remmina Remote Desktop Client远程登录服务器配置

    1.配置:点击new , 配置服务器ip地址.名称.密码 2.打开本机终端执行一下命令: echo xfce4-session>.session echo xfce4-session>.x ...

  9. SpringMVC之二:配置 Spring MVC

    Servlet 3.0规范在2009年12月份就发布了,因此很有可能你会将应用部署到支持Servlet 3.0的Servlet容器之中,如tomcat7.0及以上.在Servlet 3 规范中,可以使 ...

  10. 贪心+等价转化 HDU 1489

    等价转换,题意简单来讲如下:在一条直线均匀分布N个村庄,每个村庄要么买酒,要么卖酒,且村庄的买酒和卖酒供需平衡,总和为0,把k个单位的酒从一个村庄运到相邻的村庄需要k个单位的劳动力,输出最小的劳动力. ...