22.第27章:散列

1.概念

  • 散列:使用一个散列函数,将一个键映射到一个索引上

  • java集合框架定义了Map接口来对映射表建模。三个具体的实现类为HashMap、LinkedHashMap、TreeMap。
    HashMap:使用散列实现
    LinkedHashMap:是哟个LinkedList实现
    TreeMap:使用红黑树实现

  • 散列函数


    散列函数将键映射到散列表中的索引上

    散列函数从一个键获得索引,并使用索引来获取该键的值。

  • 完美散列函数
    我们希望设计一个函数,将每个搜索的键映射到散列表中的不同索引上。这样的函数被称为完美散列函数。

    然而,很难找到一个完美散列函数,当多个键映射到一个散列值上时,我们称产生了一个冲突。

2.散列函数和散列码

典型的散列函数首先将搜索键转换成一个称为散列码的整数值,然后将散列码压缩为散列表中的索引。

3.使用开放地址法处理冲突

是在冲突发生时,在散列表中找到一个开放位置的过程。

1)线性探测
  • 按顺序寻找下一个可用的位置。例如:如果冲突发生在hashTable[k%N],则检查hashTable[(k+1)%N]是否可用,不可用再检查hashTable[(k+2)%N],当探测到终点时,则返回表的起点,因此散列表是循环的。


  • 删除条目时,查找匹配键的条目,如果条目找到,放置一个特殊的标记表示该条目是可用的。
  • 散列表中每个单元具有三个可能的状态:被占的、标记的或者空的。
  • 存在的问题:容易导致散列表中连续的单元组被占用。当连续单元组越来越大,会放慢查找的时间。
2)二次探测法

线性探测法问题:

  • 避免了线性探测成簇的问题,但有自己本身的成簇问题,称为二次成簇。
  • 线性探测法可以保证只要表不是满的,一个可用的单元总是可以被找到用于插入新的元素,然而,二次探测法不能保证。
3)再哈希法

4.使用链地址法处理冲突

链地址法将具有同样的散列索引的条目都放在一个位置,而不是寻找一个新的位置。链地址法的每个位置使用一个桶来放置多个条目。


5.装填因子和再散列

装填因子:衡量一个散列表有多满。是元素数目和散列表的比值。对于开放地址而言,需要位置装填因子在0.5之下,对于链地址,维持在0.9之下。Hashmap采用0.75为装填因子。
再散列:如果装填因子溢出,则增加散列表的大小,并重新装载条目到一个新的更大的散列表中,这称为再散列。

6.使用散列实现映射表

使用链地址法实现映射表,对照java.util.Map来设计自定义的Map接口,命名为MyMap,具体类命名为MyHashMap。


7.使用散列实现set

使用链地址法


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

推荐阅读更多精彩内容

  • 数据结构与算法--散列表 之前学习了基于链表的顺序查找、基于有序数组的二分查找、二叉查找树、红黑树,这些算法在查找...
    sunhaiyu阅读 644评论 3 5
  • 冲突的普遍性 ⎯ ⎯ 生日悖论 我们可以考虑这样一个实际问题:某课堂上的所有学生中,是否由某两位在同一天过生日(称...
    峰峰小阅读 827评论 0 1
  • 有人不喜欢阿汤哥吗?应该没有吧。小妹今天要给你们推荐的这部影片就是《甜心先生》。 这里的“甜心先生”就是阿汤哥了,...
    麻婆电影阅读 656评论 0 0
  • 答陆原静书(二) 答“养生以静心寡欲为要……愈不可矣”句; 学到现在,对于“纯乎天理”有一些感觉,天理是本身...
    偶尔闲情阅读 327评论 0 1
  • 马上二十五岁了,本命年马上就要过完了。昨天回了一趟母校,依然那么熟悉,可是却又那么陌生。走了一遍之前走过无数遍的...
    理瑛玠阅读 109评论 0 1