20172301 《程序设计与数据结构》课堂测试修改报告

本报告详细记录了《程序设计与数据结构》课程中,郭恺同学针对顺序查找、折半查找及散列查找的课堂测试过程与结果。通过绘制不同查找方法的查找长度,对比了各种算法的效率,特别关注了散列查找中的冲突解决策略。

20172301 《程序设计与数据结构》课堂测试修改报告

课程:《程序设计与数据结构》
班级: 1723
姓名: 郭恺
学号: 20172301
实验教师:王志强老师
测试日期:2018年10月19日
必修/选修: 必修

题目内容

1333022-20181019215902044-220907089.jpg

测试过程及结果

  • 画出顺序查找的顺序表和成功平均查找长度。
    • 顺序查找的原理是遍历列表,一一比较。所以查找次数就是逐渐加一的。
    • 1333022-20181019215921526-1468927588.png
  • 画出折半查找的顺序表和成功平均查找长度。
    • 第一步,折半查找需要的是有序列表。 所以,需要对列表进行排序。
    • 序列123410112178
      查找次数32313234
    • 注意:书P164 代码
    int midpoint = (min + max) / 2;
    变量midpoint是int型而不是double型,意味着如果中点是3.5会自动转化成3。 当我们的查找项是偶数个的时候,中点可能是两个中间值的任意一个。但是根据上面的代码,系统会选择两个中间值的第一个故,查找次数如表格所示。
    • 1333022-20181019220436145-1201422350.png
  • 画出散列查找(线性探查法)的散列表和成功平均查找长度
    • 第一步,我们需要对序列进行取余操作。这里题目中给出m = 11;
    • 序列117810132421
      H(K) = K%110110132410
    • 第二部,我们把序列输入相对应的地址中。
    • 地址012345678910
      序列117813242110
    • 虽然散列查找ASL是O(1),但是那是在无冲突的条件下。这里我们要考虑冲突下的查找次数。
    • 1333022-20181019220536997-1072322655.png
  1. 画出散列查找(链地址法)的散列表和成功平均查找长度
    • 1333022-20181019220550174-2092984217.png

测试过程中遇到的问题和解决过程

  • 问题1:散列表的线性探查法对于数组末尾冲突操作如何解决?
  • 问题1解决方案:
    • 首先,注意一点是,散列表是根据序列顺序依次填入地址的 ,并非是根据排序顺序,这是我犯得错误一。
    • 然后,如果如果说地址末尾有冲突,那么应该是Hi = (H(K) + di) % 11,那么应该还是从索引0开始往后进行填充,直到数组满的时候,而不是申请新的空间,这是我的错误二。
    • 那么,如果数组满了怎么办?
    • 我想,这时不仅仅要扩容数组大小,同时应该扩大m的值。不然,序列同样还是在那个数组大小中循环。

其他(感悟、思考等)

   对于散列查找中的线性探查法解决冲突的过程还不是特别熟悉。导致我对于数组末尾冲突的理解有问题。这只是一个细节,却影响到整个ASL的计算。并且散列表并不是按照序列顺序填入的,导致序列地址也存在问题。这是以后应该注意的。

参考资料

转载于:https://www.cnblogs.com/gk0625/p/9819190.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值