散列技术——数据的查找(三)

之前我们讲到过线性表、有序表、索引表、树的查找,通过将无序的集合转为上述的结构可以实现查找功能。那么现在要用的就是散列表来查找数据,优势是能够直接找到记录地址不需要花时间查找,但是只适合与给定值相等的记录

散列技术

定义:散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储的位置 f(key)

要理解散列技术就必须先理解之前我们是怎么找到数据记录的。

非散列表查找:
用户输入关键字 ——> 找到关键字 ——> 找到和关键字存在一起的记录地址——> 找到数据记录

  1. 关键字和数据记录地址是两个内存空间,一般是连续的,此时记录地址是真实存在内存里的
  2. 最花时间的是如何找到关键字

散列表查找:
用户输入关键字 ——> 把关键字代入函数 ——> 计算得出记录地址 ——> 找到数据记录

  1. 我既不需要再一堆关键字里面找到用户输入的关键字
  2. 也不需要把记录地址存在内存里
  3. 就是通过一条对关键字的计算公式得到记录地址

散列技术就是,建立一个把关键字作为自变量,记录地址作为因变量的函数,也就是说它的核心就是函数关系,至于自变量和因变量是什么,都不太重要

散列函数(哈希函数)、散列表(哈希表)

捋一下这几个概念:
散列函数,也称哈希函数,代表关键字和记录地址的对应关系f
散列表,也称哈希表,表示的是采用散列技术将记录存储在的一块连续的存储空间——即为数据记录本身存的地方

散列技术适合什么问题?

所谓查找给定值相等的记录就是,我给什么值,就找到它的那条唯一记录。
而不是一个定值有很多条对应的记录(例如给“男”这一定值,查找班里的人,会发现有很多记录,也就是说给定的值不能是次关键字),或者说是范围性的查找

散列函数

散列函数的作用就是起一个映射关系,最理想的散列函数能够使得计算过程简单、散列地址分布均匀(为了尽最大努力减少冲突

下面方法都可以从五方面来考虑他们的优劣:

  1. 计算散列地址所需要的时间(计算方法复不复杂?)
  2. 关键字长度(普遍位数的是比较多?关键字与关键字长度差别较大?)
  3. 散列表的大小
  4. 关键字的分布情况(分布是否均匀?)
  5. 记录查找的频率(查找是否频繁?)

1.直接定址法

直接把关键字与其他常数进行简单运算得到地址

2.数字分析法

它关键点在于:抽取
数字分析法就是从关键字中抽取出某个部分作为记录地址

3.平方取中法、折叠法

都是对关键字进行变换的方法,这两种方法的效果是:对关键字位数进行增减之后抽取几位作为记录地址

4.除留余数法

(常用mod方法来控制事物如果超过一定长度后进行轮回)
在这里,通过对关键字取模来映射,那么地址就不会大于所设定的模的数。

5.随机数法

f(key) = random(key),虽然这里的random是随机函数,但是它是伪随机的——同样的随机种子会有同样的值

解决冲突的办法

解决冲突就是为了让两个本要存同一个地址的数据都能被找到不覆盖彼此,办法有

  1. 开放定址法、再散列法(探测空的位置)
    思路:如果冲突,探测找到一个空的位置,把数据放到这个位置

    探测的方法有几类:线性探测(找下一个空的位置)、二次探测(往前往后替换找空的位置)、随机探测(random函数)、换一个散列函数再尝试(再散列的方法,再散列不是指二次散列,而是上一个散列函数计算出来的冲突了,那么换一个新的散列函数重新尝试,自变量都是放原来的key)

  2. 链地址
    思路:不换地址,既然冲突了就放在一起,通过链表的形式
    image.png
  3. 公共溢出区
    思路:既然冲突了,那么就统一把冲突的放到一个地方,在散列表里面找不到就在这里找

散列表的操作

散列表是一种新的数据结构,它的特点是怎么存的我就怎么找,存储和查找的方法都是相同的,因此我们存的时候使用上面哪一种散列函数和冲突解决办法,在查找关键字的时候也是用同样的方法。

平均查找的长度取决于装填因子,而不取决于查找集合中记录个数
装填因子α=已填入表中个数/散列表长度。它标志着散列表的装满程度,装得越多当然冲突的可能就越大啦。如果使得装填因子较小,那就是一个利用空间换时间的例子了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 查找 查找表是由同一类型的数据元素(或记录)构成的集合。关键字是数据元素中某个数据项的值,也称为键值,用它可以标识...
    keeeeeenon阅读 1,903评论 0 3
  • 1. 散列表的基本概念 元素的存储位置和其关键字之间建立某种直接关系,这就是散列查找法。 (1) 散列函数和散列地...
    yinxmm阅读 1,794评论 0 0
  • 为什么要设计散列这种数据结构呢?在现实世界中,实体之间可能存在着映射关系(key-value),比如一个订单可能对...
    yhthu阅读 1,086评论 2 8
  • 基本概念 基于线性表、树表结构的查找方法,这类查找方法都是以关键字的比较为基础的。在查找过程中只考虑各元素关键字之...
    官先生Y阅读 468评论 0 2
  • 最近,我从书店淘了一本《鲁迅自述从百草园到三味书屋》,因近来比较的忙,所以看得断断续续的,不过也接近尾声了...
    龙泉迷茫一代阅读 4,735评论 56 224