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

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

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

题目内容

测试过程及结果

  • 画出顺序查找的顺序表和成功平均查找长度。

    • 顺序查找的原理是遍历列表,一一比较。所以查找次数就是逐渐加一的。
  • 画出折半查找的顺序表和成功平均查找长度。

    • 第一步,折半查找需要的是有序列表。 所以,需要对列表进行排序。

    • 序列 1 2 3 4 10 11 21 78
      查找次数 3 2 3 1 3 2 3 4
    • 注意:书P164 代码

    int midpoint = (min + max) / 2;
    

    变量midpoint是int型而不是double型,意味着如果中点是3.5会自动转化成3。 当我们的查找项是偶数个的时候,中点可能是两个中间值的任意一个。但是根据上面的代码,系统会选择两个中间值的第一个故,查找次数如表格所示。

  • 画出散列查找(线性探查法)的散列表和成功平均查找长度

    • 第一步,我们需要对序列进行取余操作。这里题目中给出m = 11;

    • 序列 11 78 10 1 3 2 4 21
      H(K) = K%11 0 1 10 1 3 2 4 10
    • 第二部,我们把序列输入相对应的地址中。

    • 地址 0 1 2 3 4 5 6 7 8 9 10
      序列 11 78 1 3 2 4 21 10
    • 虽然散列查找ASL是O(1),但是那是在无冲突的条件下。这里我们要考虑冲突下的查找次数。

  1. 画出散列查找(链地址法)的散列表和成功平均查找长度

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

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

其他(感悟、思考等)

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

参考资料

posted @ 2018-10-19 22:07  奈何明月ઇଓ  阅读(114)  评论(0编辑  收藏  举报
页尾