哈希表

哈希表

    哈希表是一种数据结构,它使用哈希函数组织数据,以支持快速插入和搜索。

哈希表的原理

哈希表的关键思想是使用哈希函数将键映射到存储桶。更确切地说:

1.当我们插入一个新的键时,由哈希函数决定这个键应该分配到哪个桶中,并将键存放在该桶中。

2.当我们想要搜索一个键时,我们通过哈希函数确定该键所在的桶,并在桶中对数据进行搜索。

例子:

    

哈希表例子

    简单的来说,哈希表是键对桶的一种结构,将两者连接起来的桥梁是哈希函数。

设计哈希表

    在设计哈希表中,我们应该注意这两个基本因素:

1.哈希函数

哈希函数(散列函数)是哈希表中最重要的组件,哈希表用于将键映射到桶上,因此哈希函数决定了哈希表如何映射。下面我们给出哈希函数需要满足的特性:

    1.确定性  

        对于每个键,哈希函数不能给出两个桶来装这个键。即如果两个散列值是不同的,则键肯定是不同的。

    2.冲突碰撞

    哈希函数的输入和输出不是一一对应的,即无法构成满射,对于一个哈希值,可能有两个值与之对应,也可能有一个值与之对应。也无法构成单射。

    3.不可逆性

    典型的散列函数都有非常大的定义域,同时散列函数具有有限的值域,在某些情况下,散列函数可以设计成具有相同定义域和值域的单射,散列函数必须具有不可逆性。

    4.混淆性

    输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。(这个适用于MAC,常用于加密方面,而常用的数据结构并没有满足)

2.冲突解决

理想情况下,如果我们的哈希函数满足一一映射,给定一个键就可以找到一个不被其他键值占用的桶,我们将不需要去处理冲突。然而, 这种是种乌托邦式的了,当我们的数据量非常大的时候,对应值也非常大。因此,在大多数情况下,冲突是不可避免的,这也是哈希函数的特性。比如,我们给定这样一个哈希函数y=x%10,显而易见,10和20都分配给了桶0,因此构成了一个冲突。

解决冲突的算法应该解决以下问题:

        如何组织在同一个桶中的值?

    如果为同一个桶分配了太多的值,该怎么办?

    如何在特定的桶中搜索目标值?

根据我们的哈希函数,这些问题与桶的容量和可能映射到同一个桶的键的数目有关。让我们假设存储最大键数的桶有 N 个键。

通常,如果 N 是常数且很小,我们可以简单地使用一个数组将键存储在同一个桶中。如果 N 是可变的或很大,我们可能需要使用高度平衡的二叉树来代替.。

通常的冲突解决方法有三种:

开放定址法(闭散列):

    开放定址法又称为再哈希法, 如果我们当前的键为p,但是Hash(p)位置已存在值,因此我们需要换个位置。此时我们利用该公式找到位置:Hi=(H(key)+di)MOD  m   i=1,2,3,4...k(k<=m-1)

解决冲突思想:为每个桶提供若干备用桶,他们之间构成一条查找链。

    那么根据i值选择的不同,开发定址法又可以分为:

    线性试探,平方试探,双向平方试探,随机试探。

封闭定址策略(开散列法)

开放定地法的思想也很简单,每个桶存放一个指针,指向存放在该桶的冲突值,组成链表。即通过数组+链表的方式解决冲突

下面给出两个哈希函数构造的练习题,可以通过开散列法解决冲突:

设计哈希集合

设计哈希映射

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

推荐阅读更多精彩内容