数据结构HASH总结三:实践基础篇

问题:
1. hash算法主表实现为什么不直接用数组,而使用malloc动态申请?
2. 另外每个桶的使用 线性队列 和 双向队列 以及 二级hash的区别以及好处是什么?
答案:
     1.
          1)hash表大小如果是固定的,当然可以采用数组;
          struct hash_head  *hash_list[1024];
          2)如果hash大小没有确定,在程序中动态变化的,那就需要使用malloc动态申请。
int hash_size = get_hash_size();
struct  hash_head  **hash_list;
*hash = malloc(hash_size);
memset(*hash, 0, hash_size);

     2.
          线性链表只能单相查找结点,即知道一个已知结点,不能找到它的前驱。  

           双向链表可以向前向后二个方向查找结点。

           还有双向循环链表,我在项目中用的比较多。直接用内核里扒下来用的。
     
           二级hash我到觉的没什么必要。使结构太复杂。可以用一级hash来代替。设计好hash算法就行了。
问题:
3.
1)已知一个线性表(38,25,74,63,52,48),采用的散列函数为H(Key)=Key%7,将元素散列到表长为7的哈希表中存储。若采用线性探测的开放定址法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 ____ ;
2)若利用拉链法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为 ____;

答案:1)11/6 ,2)8/6.对于1)中,答案给出的是12/6=2,经过验证是错误的。
分析过程:
1)采用开放定址法
key382574635248
地址44036
解决冲突过程  5 4 5 67
查找次数112142
平均查找长度:(1*3+2*2+4)/6=11/6
2)采用拉链法
     
拉链链表中元素查找次数
0631
338   5238(1次) 52(2次)
425 74 25(1次) 74(2次)
6481

平均查找长度(1*4+2*2)/6=4/3

4.设一哈希表长为13,采用线性探测法解决冲突,哈希函数H(key)=key%13 

1 )画出在空表中依次插入关键字25.20.36.15.41.52.29.72.67后的哈希表 
2 )求在等概率情况下,查找成功和查找不成功的平均查找长度


答案:
1)Hash表
          
hash表下标(地址)0123456789101112
hash表元素52 15412967 2072 36 25
解决冲突过程   2 33 4  2 3 4 5  7 8    
查找次数1 1224 12 1 1

2)查找成功的平均查找长度:(1*5 +2*3 +4*1)/9 = 15/9 。查找成功的平均查找长度为 SUM(查找次数)/SUM(元素个数)
3)  查找失败的平均查找长度
计算长度为m的哈希表中装填有n个记录的查找不成功时的平均查找长度相当于计算在这张表中填入第n+1个记录时所需要的比较次数的期望值。
第N+1个记录可能是0~12
若 N+1个记录是0,由于位置0已经被占用,位置1没有占用,所以比较2次,依次类推。


hash表下标0123456789101112
hash表元素52 15412967 2072 36 25
解决冲突过程   2 33 4  2 3 4 5  7 8    
查找次数1 1224 12 1 1
查找不成功2154321321213

故查找不成功的平均查找长度为(2+1+5+4+3+2+1+1+2+2+1+2+1+3)/13=30/13


5.
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为:      H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
(1) 请画出所构造的散列表。
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。


答案:
(1)
(2)查找成功的平均查找长度

(表3)

        所以ASLsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7
    查找不成功的平均查找长度
计算查找不成功的次数就直接找关键字到第一个地址上关键字为空的距离即可, 但根据哈希函数地址为MOD7,因此初始只可能在0~6的位置

    因此查找不成功的次数表如下表所示

(表4)

       所以ASLunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值