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

题目

将关键字序列{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)
    search for 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次。

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

对于这部分,个人觉得有人整理的比较好,很有条理,很清晰,可以借鉴一下,链接如下:
线性探测再散列法处理冲突

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐