11-1 (散列最长探查的界) 采用开放寻址法,用一个大小为 m 的散列表来存储 n ( n <= m/2 ) 个数据项目。
a. 假设采用均匀散列,证明:对于 i = 1,2,... ,n,第 i 次插入需要严格多于 k 次探查的概率至多为 2^(-k) 。
ANSWER:
b. 证明:对于 i = 1,2,... ,n,第 i 次插入需要多于 2lgn 次探查的概率为 O( 1/ n^2 )。
ANSWER:
设随机变量 Xi 表示第 i 次插入所需的探查次数。在上面(b)中已证明Pr{ Xi > 2lgn } = O( 1/n^2 )。设随机变量X = max( 1<= i <= n )Xi 表示 n 次插入中所需探查数的最大值。
c. 证明:Pr{ X > 2lgn } = O( 1/n )。
ANSWER:
d. 证明:最长探查序列的期望长度为 E( x ) = O( lgn )。
ANSWER:
11-2 (链接法中槽大小的界) 假设有一个含 n 个槽的散列表,向表中插入 n 个关键字,并用链接法来解决碰撞问题。每个关键字被等可能地散列到每个槽中。设在所有关键字被插入后,设 M 是各槽中所含关键字数的最大值。读者的任务是证明 M 的期望值E[ M ]的一个上界为O( lgn / lglgn )。
a. 证明:正好有 k 个关键字被散列到某一特定槽中的概率 Qk 为 Qk = ( 1/n )^k * ( 1-1/n )^( n-k ) * C(n,k)。
ANSWER:共有C(n,k)个组合;k 个关键字被散列到该特定槽的概率为 ( 1/n )^k;剩下( n-k )个关键字被散列到其它槽的概率为( 1-1/n )^( n-k )。
b. 设 Pk 为 M = k 的概率,即包含最多关键字的槽中有 k 个关键字的概率。证明:Pk ≤ nQk。
ANSWER:令槽 i 为最多关键字的槽,则其它槽的关键字个数需少于 k ,所以槽 i 为关键字最多且关键字个数为 k 的概率为
c. 应用斯特林近似公式(3.18)来证明 Qk < (e^k) / (k^k)。
d. 证明:存在常数 c > 1,使得 Qk0 < 1 / n^3 对 k0 = clgn / lglgn 成立。并有结论:对 k ≥ k0 = clgn / lglgn,Pk < 1 / n^2 成立。
e. 证明:E[ M ] ≤ Pr{ M > clgn / lglgn } * n + Pr{ M ≤ clgn / lglgn } * clgn / lglgn。
并有结论:E[ M ] = O( lgn / lglgn )。
ANSWER:
11-3 (二次探查) 假设要在一个散列表 (表中的各个位置为0,1, ...,m-1 ) 中查找关键字 k,并假设有一个散列函数 h 将关键字空间映射到集合{ 0,1,..., m-1 }上,查找方法如下:
1. 计算值j = h( k ),置 i = 0。
2. 探查要找的关键字 k 的位置,或者找到了,或者该位置为空,并结束查找。
3. 置 i = i + 1。如果 i = m,则表已满,于是终止探查;否则,设 j = (i + j) mod m,返回到步骤2。
假设m是2的幂。
a. 通过给出等式( 11.5 )中 c1 和 c2 的适当值,来证明这个方案是一般的“二次探查”法的一个实例。
ANSWER:当第 i 次查找,
j = [ h( k ) + 1 + 2 + ... + i ] mod m = [ h( k ) + i /2 + i^2 / 2 ] mod m。
∴ C1 = 1/2 ,C2 = 1/2 。