散列表

概念

散列表的实现常常叫做散列(hashing)。散列是一种用于以常数平均时间执行插入、删除和查找的技术。
散列函数:每个关键字被映射到从0到TableSize-1这个范围中的某个数,并且被放到适合的单元中。这个映射就叫做散列函数(hash function)。
冲突:当两个关键字散列到同一值的时候,称为冲突。

散列函数

好的办法通常是保证表的大小是素数。
如果当一个元素被插入时另一个元素已经存在(散列值相同),那么就产生一个冲突,这个冲突需要消除。解决这种冲突的方法有几种,最简单的两种:分离链接法和开放定址法。

分离链表法

将散列到同一个值的所有元素保留到一个表中。

开放定址法

在开放定址散列算法系统中,如果有冲突发生,那么就要尝试选择另外的单元,直到找出空的单元为止。更一般地,单元h0(X),h1(X),h2(X),等等,相继被试选,其中hi(X) = (Hash(X) + F(i)) mod TableSize,且F(0) = 0。
函数F是冲突解决方法。
因为所有的数据都要置入表内,所以开放定址散列法所需要的表要比分离链接散列用表大。一般来说,对开放定址散列算法来说,装填因子应该低于λ = 0.5

  • 线性探测法
    在线性探测法中,函数F是i的线性函数,典型情形是F(i) = i。
    只要表足够大,总能够找到一个自由单元,但是如此花费的时间是相当多的。更糟的是,即使表相对较空,这样占据的单元也会形成一些区块,其结果称为一次聚集,于是,散列到区块中的任何关键字都需要多次试选单元才能够解决冲突,然后该关键字才能被添加到相应的区块中。
  • 平方探测法
    平方探测法师消除线性探测中一次聚集问题的冲突解决方法。平方探测就是冲突函数为二次函数的探测方法。流行的选择是F(i) = i2
    虽然平方探测排除了一次聚集,但是散列到同一位置上的那些元素将探测相同的备选单元。这叫做二次聚集。
  • 双散列
    对于双散列,一种流行的选择是F(i)=i·hash2(x).

再散列

如果散列表的元素填得太满,那么操作的运行时间开始消耗过长,且Insert操作可能失败。一种解决方式是建立另外一种大约两倍大的表(而且使用一个相关的新散列函数。扫描整个原始散列表,计算每个(未删除)元素的新散列值并将其插入到新表中。整个操作就叫做再散列。虽然这是一种非常昂贵的操作;其运行时间为O(N),因为有N个元素要再散列而表的大小约为2N。
再散列可以用平方探测以多种方式实现。

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

推荐阅读更多精彩内容

  • 基本概念 基于线性表、树表结构的查找方法,这类查找方法都是以关键字的比较为基础的。在查找过程中只考虑各元素关键字之...
    官先生Y阅读 486评论 0 2
  • 引子 散列的概念应用很广泛,比如加密,散列表,几何散列等。而散列表更是日常工作中常见的数据结构,同时也是面试中最常...
    jatesun阅读 1,132评论 0 1
  • 概念 散列技术: 在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f...
    liangxifeng833阅读 2,550评论 1 3
  • 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数...
    郝程序猿阅读 2,230评论 1 7
  • 第一次听到人生的减法这个词,是参加得到社群的线下活动,群友们谈自己的思想想法时,所说的, 当时自己是蒙的,人生...
    刘猫爱虎阅读 209评论 0 0