第九章 散列表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

冲突解决的方法

闭散列表:利用本散列表中的空余单元
线性探测法 二次探测法 再次散列法


开散列表:将碰撞的结点存放在散列表外 的各自的线性表中(链接法)
线性探测法
[Amdahl-Boehme-Rocherster-Samuel, IBM 1953]


当散列发生冲突时,探测下一个单元,直 到发现一个空单元 在一个规模为11的散列表中依次插入关键 字17、12,23,60、29、38 ,采用的散列 函数为H(key) = key MOD 11。
……
……
ht [m1]
… …
M buckets
T ::= total number of distinct possible values for x n ::= total number of identifiers in ht[ ]
S slots
identifier density ::= n / T
Hash Tables
[0] [1] … … [s1]
ht [ 0 ]
ht [ 1 ]
……
……
For each identifier x, we define a hash function f ( x ) = position of x in ht[ ] (i.e. the index of the bucket that contains x )
1 2 1 2
〖Example〗 Mapping n = 10 C library a hash table ht[ ] Collision andfunctions overflow into happen with M = 26 buckets and S = 2. if s = 1. simultaneously Loading density = ? 10 / 52 = 0.19 Slot 0 Slot 1 acos atan
To map the letters a ~ z to 0 ~ 25, we may define f ( x ) = ? x [ 0 ] ‘a’
acos
atan
define
ceil
float
floor
exp
clock
char
ctime
Without overflow,
Tsearch = Tinsert = Tdelete = O( 1 )
0 1 2 char ceil 3 define 4 exp 5 float floor 6 …… 25
Uniform hashing assumption

Uniform hashing assumption. Each key is equally likely to hash to an integer between 0 and M - 1. Bins and balls. Throw balls uniformly at random into M bins.



Birthday problem. Expect two balls in the same bin after ~ M / 2 tosses. Coupon collector. Expect every bin has ≥ 1 ball after ~ M ln M tosses. Load balancing. After M tosses, expect most loaded bin has Θ ( log M / log log M ) balls.
平方取中法


如果关键字中各位的分布都比较均匀,但关键字 的 值域比数组规模大,则可以将关键字平方后, 取其结果的中间各位作为散列函数值。由于中间 各位和每一位数字都有关系,因此均匀分布的可 能性较大。 比如:4731 * 4731 = 22,382,361。中间部分究 竟要选取几位,依赖于散列表的单元总数。若散 列表总共有100 个单元,我们可以选取最中间的 部分,即第4、5位,那么关键字值为4731的结点 的散列地址可选为82。

Actual number of combinations < 3000
f ( x ) = ( x[N i 1] * 32i ) % TableSize ;
x[0] x[1]
Baidu Nhomakorabea
……… …
x[N-2] x[N-1]
Carefully select
some characters from x.
loading density ::= n / (SM)
A collision(冲突、碰撞) occurs when we hash two nonidentical identifiers into the same bucket, i.e. f ( i ) = f ( i ) when i i . An overflow occurs when we hash a new identifier into a full bucket.
折叠法



如果关键字相当长,以至于和散列表的单 元总数相比大得多时,可采用此法。 具体实现:是选取一个长度后,将关键 字 按此长度分组相加。 例如,关键字值为542242241,按3位折叠, 可以得到542+242+241=1025。抛弃进位, 得到散列结果为25。
〖例〗 构造长度不超过8的字符串x的散列函数,其字符串 中字符用ASCII码表示,TableSize = 10,007
除留余数法


H(key)= key MOD p 或 H(key)= key MOD p + c 这里 p 为小于等于m素数。 如:m = 1024, 则 p= 1019 。余数总在 0 ~ p-1 之间。 选取 p 为质数的理由:


设 key 值都为 5 的倍数,选 p 为 95;则 H(key) = key MOD p ,结果为:0、 5、10、15、…… 90 。4/5 的单元 被浪费掉。而5、100、195等又会发生碰撞 设 key 值都为奇数,选 p 为偶数;则 H(key) = key MOD p , 结果为奇数,一半单元被浪费掉。
0 1 23 12 2 3 4 5 38
60
6
17
7
29
8
9
10
线性探测法 — 删除和查找

查找
计算 addr = H(key) while (addr的内容非空&& 不等于要查找的键) ++addr

if (addr内容为空)没有找到 else 找到 删除:一般来讲,删除某一元素,先要找到该元 素, 然后把该空间的内容清空。但这样就给查找 带来了问题,某些元素会查不到。解决的方案是 采用迟删除,即不真正删除元素,而是做一个删 除标记。
If x is too long (e.g. street address), the early characters will be left-shifted out of place.
选取散列函数需考虑的因素

综合考虑时间和空间的限制
计算散列函数所需时间 关键字长度 散列表长度(散列地址范围) 关键字分布情况 记录的查找频率

第9章 散列表


基本概念 哈希(散列)函数 冲突(碰撞)解决 散列表类的实现
哈希(散列)函数


每个结点在表中的存储位置是由一个函数H确 定。该函数以结点的关键字值为参数,计算出 该关键字对应的结点的存储位置。该函数称为 哈希函数 哈希函数的值域为 0 ~ m-1,m为表长 哈希函数的选择标准
Can we do better?
HASHING
Search by Formula
Interpolation Search :
Find key from a sorted list f [ l ].key, f [ l+1 ].key, ... , f [ u ].key. f[u].key key
f [u ].key f [l ].key n

key f [l ].key i l
i l
l i? u
( key f [l ].key)n f [u ].key f [l ].key
f[l].key
If ( f [ i ].key < key ) Else u = i ;
l=i;
计算速度快 散列地址尽可能均匀,使得冲突机会尽可能的少

常用的哈希函数



直接地址法 除留取余法 数字分析法 平方取中法 折叠法
直接地址法

H(key) = key 或 H(key) = a×key + b 如:关键字集合为{100,400,600,200, 800,900},取散列函数为H(x)=key,则 需要901个单元。取H(x)=x/100,需要10个 单元。



初始化:将一个下标为0到65535的数组a初始化为一个 特殊的表示单元为空的值(NULL) insert(i):将i存放到a[i.key]中 find(i):取出a[i.key]的值 remove(i):将a[i.key]重新设为空值。

每种操作的时间很明显是个常量
方案的缺陷

假设关键字有32位的整数而不是16位的整 数。那 么数组a必须能保存232=4.29×10940亿个项,这 是不实际的。
数据结构 Data Structure
第九章 散列表
第9章 散列表


基本概念 哈希(散列)函数 冲突(碰撞)解决 散列表类的实现
HASHING
But we already have binary search in O( ln n ) time after sorting. And we already have algorithms for sorting in optimal time O( n ln n )... What is hashing for? Wait a minute said that Then we just — dowho something O( else n ln besides n ) is the optimal time? comparison. For searching
解决方案:用一个将大数字映射成一个较小 的、更容易 管理的数字的函数来达到这个 目的。将一个项映射成一个 较小的下标的 函数称为散列函数(hash function)。 带来的问题:冲突和碰撞


如果这些关键字不是整数而是字符串(有时甚至 是更一般的信息),它们不能用来作为数组的下 标。
解决方案:将字符串解释为一个整数。
数字分析法

对关键字集合中的所有关键字,分析每一 位上数字分布。取数字分布均匀的位作为 地址的组成部分
3 4 7 0 5 2 4 3 4 9 1 5 8 7 3 4 8 2 5 9 6 3 4 8 5 5 7 0 3 4 8 6 5 0 5 3 4 9 8 5 5 8 3 4 7 9 5 7 1 ──────── ①②③④⑤⑥⑦ 第1、2、5列对区分不同的关键字完全没有 意义,第3列意义较小。于是可以只选择4、 6、7三列的值。

*不存在一种万能的散列函数
Basic rule. Need to use the whole key to compute hash code; consult an expert for state-of-the-art hash codes.
第9章 散列表


基本概念 哈希(散列)函数 冲突(碰撞)解决 散列表类的实现
n elements
哈希(散列)法思想

哈希法,也称散列法。它不用比较的办法, 而是直接根据所求结点的关键字值 KEY 找 到这个结点。因此,它的时间复杂性为 O(1) ,优于任何其它的查找算法。但它不 支持有关有序操作。
基本概念

假设我们处理的所有的数据元素的关键字都是较 小的非负整数,从0到216=65535。我们可以用一 个简单的数组按如下步骤实现这些操作。
f ( x ) = ( x[i]) % TableSize
If x[i] [0, 127], then f ( x ) [0, 1016 ? ]

f ( x ) = (x[0]+ x[1]*27 + x[2]*272) % TableSize ;
Total number of combinations = 263 = 17,576
相关文档
最新文档