一、链地址法在等概率下查找成功和查找不成功的平均查找长度:将关键字序列{1 13 12 34 38 33 27 22} 散列存储到散列表中。散列函数为:H(key)=key mod 11,处理冲突采用链地址法,求在等概率下查找成功和查找不成功...

一、链地址法在等概率下查找成功和查找不成功的平均查找长度:

题目
将关键字序列{1 13 12 34 38 33 27 22} 散列存储到散列表中。散列函数为:H(key)=key mod 11,处理冲突采用链地址法,求在等概率下查找成功和查找不成功的平均查找长度
1mod11=1,所以数据1是属于地址1
13mod11=2,所以数据13是属于地址2
12mod11=1,所以数据12也是属于地址1(这个数据是数据1指针的另一个新数据)
34mod11=1,所以数据34是属于地址1(这个数据是数据12指针的另一个新数据)
38mod11=5,所以数据38是属于地址5
33mod11=0,所以数据33是属于地址0
27mod11=5,所以数据27是属于地址5,(这个数据是数据38指针的另一个新数据)
22mod11=0,所以数据22是属于地址0,(这个数据是数据33指针的另一个新数据)
链地址法处理冲突构造所得的哈希表如下:
查找成功时: ASL=(3×1+2×3+1×4)/8=13/8, 其中红色标记为查找次数。也就是说,需查找1次找到的有4个,其它以此类推…
查找不成功时:ASL=(3+4+2+1+1+3+1+1+1+1+1)/11=19/11;或者 ASL=(7×1+1×2+2×3+1×4 )/11=19/11,其中红色标记为查找次数。以第一个3为例,其对应于0地址位,确定查找不成功需比较3次,其它以此类推…
原理:
链地址法插入数据的时候采用采用头插法(插入每个链表的表头),因为习惯默认新插入进来的数据,马上就要访问到。下边是实现的伪代码
CHAINED-HASH-INSERT(T, x) insert x at the head of list T[h(key[x])] CHAINED-HASH-SEARCH(T, k) searchfor an element with key k in list T[h(k)] CHAINED-HASH-DELETE(T, x) delete x from the list T[h(key[x])]
例子
例如,查找16的时候,根据散列函数在地址为5的链表查找,首先找到27,再找到38,然后找到38的后继节点为空,查找结束。查找结果失败,共查找3次。

二,线性探测再散列法处理冲突

对于这部分,个人觉得有人整理的比较好,很有条理,很清晰,可以借鉴一下,链接如下:
哈希表:线性探测法和链地址法求查找成功与不成功的平均查找

哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

了解ASL的公式
查找成功时:ASL = 1 n \frac{1}{n}n1 ∑ i = 1 n C i \sum_{i=1}^{n} C_i∑i=1nCi
n 为散列表中记录的个数(不是表的长度),
Ci 为查找成功的第 i 个记录所需要的比较次数(表中空的记录意味着不成功,是不算在里面滴)
查找不成功时:ASL = 1 r \frac{1}{r}r1 ∑ i = 1 n C i \sum_{i=1}^{n} C_i∑i=1nCi
r 为散列函数取值的个数(不是表的长度)。这个就充分解释了为什么散列函数 H(Key) = (key) MOD 11 在计算查找不成功ASL时,r = 11了,是因为这个散列函数的取值为 0~10,可以取11个值,所以 r = 11。
Ci 为散列函数取值为 i时,查找失败时第 i 个记录所需要的比较次数(表中的有些部分,散列函数根本取不到,自然也就不在计算里了)
我想只要把这两个公式看懂,查找成功与不成功的ASL也就自然会求了。