CLSR 11.2散列表

来源:互联网 发布:齐次变换矩阵 编辑:程序博客网 时间:2024/06/04 18:19

11.2-1
对两个不同的关键字 k,l,定义随机变量指示器 Xkl=I{h(k)=h(l)},则 Pr{Xkl=1}=Pr{h(k)=h(l)}=1/m,所以 E[Xkl]=1/m
Y 表示总的冲突数,所以:

E[Y]=E[klXkl]=(n2)1m=n(n1)2m

11.2-2
这里写图片描述

11.2-3
链表排序后,查找平均次数为 α/2
查找成功:我们需要查找的元素任然是哈希表中的任意一个,平均时间 Θ(1+α)。证明和书上查找成功类似。
查找失败:只是平均查找次数变为了 α/2,因此平均时间还是 Θ(1+α)
插入:由于插入时要排序,插入操作和查找失败操作类似,因此平均时间是 Θ(1+α)
删除:和查找成功一样,平均时间 Θ(1+α)

11.2-4
槽的标志位用来指示槽是否是空槽,自由链表由表中所有空槽组成的一个双向链表,因此自由链表中空槽有两个指针。对于已经使用的槽包含一个元素和一个指向下一个散列到该槽的元素的指针(可能为空)。

INSERT
1) 散列到一个空槽,很简单,直接从自由链表取出空槽,然后存入元素和一个空指针;由于自由链表是双向链表,所以可以在 O(1) 的时间完成;
2) 一个元素 x 散列到槽 j,但是槽 j 里面已经装了一个元素 y。若元素 y 也是散列到 j (即 x,y 有冲突,若不是则由于在插入的时候元素 y 是借用的槽 j),则执行 3),否则执行 4);
3) 从自由链表中取出一个空槽(这个槽不属于元素 x,这里只是暂时借用),装入元素 x 并插入到槽 j 所指向的链表中;
4) 同样先取一个空槽(这个槽不属于 x,y,暂时借用),新槽中写入 y 的内容(包括值和指针),将原来的槽还给 x,同时更新原来指向 j 的槽使之指向这个新槽。

DELETE
设存在槽 j 的元素 x 是要被删除的元素;
1) 散列到槽 j 的元素只有一个,即元素 x ,删除这个槽并归还给自由链表;
2) 假设元素 x 散列到槽 j,并且元素 x 属于槽 j,同时还有其他元素散列到槽 j,此时删除槽 j 所指向的链表的第一个元素并释放元素 x
3) 假设元素 x 散列到槽 j,并且元素 x 不属于槽 j,释放 x 的槽并更新原来指向 x 的指针使之指向 x 的后继。

SEARCH
检查关键字散列的槽,若没有则追踪这个槽所指向的链表。

和书上的一样,SEARCH操作的期望运行时间 O(1+α),但是由于 α1,所以上述操作均在 O(1) 的期望值。

11.2-5
由鸽笼原理知:若全域 U 中所有元素散列到大小为 m 的散列表中,则必有一个槽的元素数量大于n,否则,当每个槽散列的元素都少于 n 个时,m 个槽一共能散列元素小于等于 nm 个,与题目矛盾。

11.2-6
采用如下方法:
1) 随机选择一个槽,设散列到该槽的元素个数为 k
2) 从 1L 中随机选取一个数 p,若 pk,则返回,否则重复1)。
现在我们把这个哈希表想象成 mL 列的一个表,每个槽中链接的平均元素个数为 n/m,即装填因子 α,所以一次成功的概率就是 (n/m)/L,因此找一个槽并返回所需尝试的次数期望是 Lm/n。返回的时候,需要从 O(L) 长度的链表中取得所需元素,期望运行时间就是 O(L(1+m/n))=O(L(1+α))

0 0