散列表/哈希表

0.散列表的定义

<0>定义:根绝键(Key)而直接访问内存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需要查询的数据映射到表中的一个位置来访问记录,加快了查找速度。这个映射函数称作散列函数,存放记录的数组称作散列表。

<1>一些基本的概念

(1):若关键字为k,则其值存放在f(k)的存储位置上。由此,不需要比较便可以直接取得所查的记录。成哥这对应关系f为散列函数,建立的表为散列表。

(2):对不同关键子可能得到同意散列地址,即k1 != k2, 但是f(k1) == f(k2),这种现象称为冲突。

(3):若对于关键字集合中的任意一个关键字,经散列函数映射到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数,这使得关键字经过散列函数得到的是一个“随机的地址”,从而减少了冲突。

1.散列表的抽象数据类型

类型名称:符号表(SymbolTable)

数据对象集:符号表是"名字(Name)-属性(Attribute)"对的集合

操作集:

Table\in SybolTable, Name\in NameType, Attr\in AttributeType

1.SymbolTable InitializeTable(int TableSize);创建一个长度为TableSize的符号表

2.bool IsIn(SymbolTable Table, NameType Name);查找特定名字Name是否在符号表Table中

3.AttributeType Find(SymbolTable Table, NameType Name);获取Table中指定名字Name对应的属性

4.SymbolTable Modefy(SymbolTable Table, NameType Name, AttributeType Attr);将Table中指定名字Name的属性修改为Attr

5.SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr);向Table中插入一个新名字Name及其属性Attr

6.SymbolTable Delete(SymbolTable Table, NameType Name);从Table中删除一个名字Name及其属性

2.散列函数的构造方法

<0>:一个“好的”散列函数一般会考虑一下两个因素:

(1):计算简单,以便提高运转速度

(2):关键词对应的地址空间分布均匀,以尽量减少冲突

<2>:对于数字关键词的散列函数构造

(1):直接定址法:取关键词的某个线性函数值为散列地址,即h(key) = a*k + b;

(2):除留余数法:散列函数为:h(key) = key % p; 一般的p为TableSize或者质数。

(3):数字分析法:分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址;比如所有号码的后四位作为地址。

(4):折叠法:把关机那次分割成位数相同的几个部分,然后叠加:如56793542 ---->542 + 793 + 056 = ---->1391---->391

(5):平方取中法:如56793542---->56793542 * 56793542 = 322550(641)2905764

<3>:字符关键词的散列函数构造

(1):一个简单的散列函数----ASCII码加和法:对字符型关键词key定义散列函数如下:

h(key) = ( \sum_{}  key[i[) mod TableSize
.

(2):简单的改进-----前三个字符移位法:h(key) = (key[0] * 27^2 + key[1] * 27 + key[2] * 1) mod TableSize;

(3):好的散列函数------移位法:涉及关键词的所有n个字符,并且分布的很好:

h(key) = (\sum_{i = 0}^{n-1}key[n - i - 1] \times 32^i ) mod   TableSize

<4>:装填因子:设散列表空间大小位m,填入表中的元素个数是n,则a = n / m称为列表的装填因子。

3.冲突处理方法

<1>:常用处理冲突的思路:

(1):换一个位置:开放地址法

(2):同一位置的冲突对象组织在一起:链地址法

<2>:开放地址法:一旦产生冲突,就按某种规则去寻找另一空地址

若发生了第i次冲突,试探的下一个地址将增加di,基本公式是:

hi(key) = (h(key) + di) mod TableSize;

di决定了不同的解决冲突的方案:线性探测、平方探测、双散列

(1):线性探测法:以增量序列1,2,...,(TableSize - 1)循环探测下一个存储地址

(2):平方探测法----二次探测:以增量序列1^2, - 1^2, 2^2, - 2^2, ... . q^2, - q^2,且

q \leq \lfloor TableSize / 2 \rfloor
循环试探下一个存储地址。

注意:平方探测法存在当HashTable还有空间时,但是并不能找到的特点。

有定理显示:如果散列表的长度TableSize是某个4k + 3(k 是正整数)形式的素数时,平方探测法就能探测到整个散列表空间。、

Ps:在开放地址散列表中,删除操作要很小心。通常只能“懒惰删除”,即需要增加一个“删除标记(Deleted)”,而并不是真正的删除它,一遍超找不到时会"断链"。其空间可以在下次插入时重用。

(3):双散列探测法(Double Hashing):di为i*h2(key),h2(key)是另外一个散列函数,探测序列:h2(key), 2h2(key), 3h2(key), ... .

i:对任意的key,h2(key) != 0

ii:探测序列还应该保证所有的散列存储单元都应该能够被探测到,选择一下形式具有良好的效果:h2(key) = p - (key mod p);其中p,TableSize都是素数

(4):再散列

i:当散列表的元素太多时(即装填因子a太大时),查找效率会下降。实用的最大装填因子:0.5 <= a <= 0.85

ii:当装填因子过大时,解决的方法是加倍扩大散列表,这这过程叫做“再散列”

iii:分离链式法:将相应位置上冲突的所有关键词存储在同一个单链表中。

4.散列表的性能分析

<1>:平均查找长度(ASL)用来衡量散列表的查找效率:成功、不成功

<2>:关键词的比较次数,取决于产生冲突的多少。影响产生冲突多少有以下三个因素:

(1):散列函数是否均匀

(2):处理冲突的方法

(3):散列表的装填因子a

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