zoukankan      html  css  js  c++  java
  • 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的计算。并且散列表并不是按照序列顺序填入的,导致序列地址也存在问题。这是以后应该注意的。

    参考资料

  • 相关阅读:
    svn安装教程
    六、数组类的创建
    五、顺序存储线性表分析
    四、StaticList 和 DynamicList
    三、顺序存储结构的抽象实现
    二、线性表的顺序存储结构
    一、线性表的本质和操作
    专题五:局部变量、全局变量global、导入模块变量
    专题四:文件基础知识、字符编码
    专题3-2:列表基础知识:二维list排序、获取下标和处理txt文本实例
  • 原文地址:https://www.cnblogs.com/gk0625/p/9819190.html
Copyright © 2011-2022 走看看