数据结构-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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一条关于 HTTP 响应的记录,其中包含了以下信息: - Accept-Ranges: bytes,表示服务器接受客户端对资源的部分请求。bytes 表示客户端可以通过指定 Range 头来请求资源的某个部分。 - Connection: keep-alive,表示客户端和服务器之间的连接保持活动状态,可以进行多次请求和响应。 - Content-Type: text/html,表示响应的内容类型为 text/html,即 HTML 文本。 - Date: Sat, 10 Jun 2023 03:13:53 GMT,表示响应的时间,按照 GMT 标准格式表示。 - Etag: "1C6094D207D6ED5F8C9F81500F7A0C39",表示资源的实体标签,用于判断两个资源是否相同。如果两个资源的 Etag 值相同,则表示这两个资源相同。 - Keep-Alive: timeout=4,表示服务器设置了一个 4 秒的时间,如果在这个时间内没有收到客户端的请求,则关闭连接。 - Last-Modified: Sat, 10 Jun 2023 03:03:09 GMT,表示资源的最后修改时间,按照 GMT 标准格式表示。 - Proxy-Connection: keep-alive,表示代理服务器和目标服务器之间的连接保持活动状态,可以进行多次请求和响应。 - Server: AliyunOSS,表示服务器的类型为阿里云对象存储服务。 - X-Oss-Hash-Crc64ecma: 3312235743083856566,表示对象的 CRC64 校验值。 - X-Oss-Object-Type: Normal,表示对象类型为普通对象,即不是分块上传的对象。 - X-Oss-Request-Id: 6483EA719DB5783631D09C6E,表示本次请求的唯一标识符。 - X-Oss-Storage-Class: Standard,表示对象存储的存储类型为标准类型,即最常用的对象存储类型。 总体来说,这条记录是服务器对客户端的 HTTP 响应。响应的内容类型为 text/html,服务器支持客户端对资源的部分请求,同时客户端和服务器之间的连接和代理服务器和目标服务器之间的连接都保持活动状态。响应的时间、资源的实体标签、最后修改时间等信息都被包含在响应头中。其中,X-Oss-Hash-Crc64ecma 表示对象的校验值,用于检查对象在传输过程中是否发生了损坏。X-Oss-Request-Id 表示本次请求的唯一标识符,用于服务器进行请求追踪和日志记录。X-Oss-Storage-Class 表示对象存储的存储类型,不同的存储类型对应不同的费用和服务水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值