注:以下答案均为自己思考,难免有误,欢迎指正。
11.3-1: 将长度为n的链表进行排序,将关键值的散列值相同的元素排为相邻。而散列表有点类似于链接法解决冲突的散列表。
11.3-2: 一个字符的ASCII码占七位,而128=2^7。所以每次只需计算一位字符(在结果之中互不交叉),而且至多只需要计算后面5位。
11.3-3:(两个字符串有相同的字符和位数,只是排列不同而已)
假设字符串有r位,则散列值为:
又因为字符串有相同的字符,取余前面的求和都相等,所以散列值相等。
11.3-4: 分别为700、318、936、554、172
11.3-5: 对于散列表中每个槽中分配的元素均匀,则碰撞概率的最大值会最小(否则最大值会出现在链表长度最长的槽中)。
假设|U|=n ,|B|=m 。则任意两个元素发生碰撞的概率:
故假设得证。
11.4-1: 线性探查: 22、88、 0、 0、 4、15、28、17、59、31、10
二次探查: 22、 0、88、17、 4、 0、28、59、15、31、10
双重散列: 22、 0、59、17、 4、15、28、88、 0、31、10
11.4-2: HASH-DELETE(T,x)
T[x.key] = DELETED
-----------------------------------------
HASH-INSERT(T,k)
for i=0 to m //m is the number of elements in the table
j = h(k,i)
if T[j]==NIL or T[j]==DELETED
T[j] = K
return j
error "hash table overflow!"
11.4-3: 根据前面公式有
成功查找 - 1/α*ln(1-α) | 不成功查找 1/(1-α) | |
α = 3/4 | 1.848 | 4 |
α =7/8 | 2.377 | 8 |
11.4-5: 根据上面公式,用MATLAB解出来约为:0.7135