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

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

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

题目内容

测试过程及结果

  • 画出顺序查找的顺序表和成功平均查找长度。
    • 顺序查找的原理是遍历列表,一一比较。因此查找次数就是逐渐加一的。
  • 画出折半查找的顺序表和成功平均查找长度。
    • 第一步,折半查找须要的是有序列表。 因此,须要对列表进行排序。
    • 序列 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的计算。而且散列表并非按照序列顺序填入的,致使序列地址也存在问题。这是之后应该注意的。web

参考资料

相关文章
相关标签/搜索