20172301 2018-2019-1 《程序设计与数据结构》课堂测试(三种查找方法的练习)报告

20172301 2018-2019-1 《程序设计与数据结构》课堂测试(三种查找方法的练习)报告

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

1.测试内容

  • 给定关键字序列11,78,10,1,3,2,4,21试分别用顺序查找、折半查找、散列查找(用线性探查法和链地址法来实现查找)。试画出他们对应的存储形式(顺序查找的顺序表、折半查找的判定树、两种散列查找的散列表),并求出每一种查找的平均查找长度,其中的散列函数H(k) = k % 11

2. 测试过程及结果

  • 设计思路:

    • 针对三种不同的查找方法,实现不同查找顺序和次数的序列查找,描绘出对应的存储形式和进行平均查找长度的计算。
    • 平均查找长度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度,ASL()
    • 散列查找的冲突:以序列元素的关键字K为自变量,通过函数H(k)计算出该元素的存储位置,在不同的序列元素计算出相同的存储位置,导致多个不同序列元素存放在同一个存储位置。
  • 步骤:

  • 顺序查找--从列表头开始依次比较每一个值,直至找到该目标,结果是要么找到目标,要么到达列表尾并得出该组中不存在该目标的结论。

    • 将序列内容存入列表中,然后从头开始进行遍历式查找来确定查找元素。
    • 结果图片:
  • 折半查找--从排序列表的中间开始查找,如果中间元素不是目标元素,则继续取半搜索。重复之前的操作,将取半长度的中间开始查找,在每一次查找操作后,将排除剩余待搜索的一半数据。

    • 将序列内容进行排序,然后按大小存入列表中,开始取中间查找,并在每次查找中排除一半查找长度。
    • 结果图片:
  • 散列查找--在进行查找时,在记录的存储位置与它的关键字之间建立一个确定的对应关系,以线性表中每个元素的关键字K为自变量,通过函数H(k)计算出该元素的存储位置,函数H(k)即哈希函数(散列函数),。这种查找方法称为散列查找。

    • 通过哈希函数运算出的关键字序列的存储位置:
    • 结果图片(线性探查)错误位置

  • 错误分析:忘记线性探测再散列的增量序列是在整体的尾部还是在取余前,所以按照在整体的尾部进行计算导致算错。
  • 线性探测再散列课堂讲解PPT图片:
    - 结果图片(链式探查):

散列查找发生冲突的解决方案

  • 开放地址法--线性探测再散列、二次探测再散列、伪随机探测再散列
  • 链地址法
    • 链地址法的优点
    • (1)链地址法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
    • (2)由于链地址法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
    • (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而链地址法中可取α≥1,且结点较大时,链地址法中增加的指针域可忽略不计,因此节省空间;
    • (4)在用链地址法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
    • 链地址法的缺点
    • 指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。
  • 平方探测法

其他(感悟、思考等)

上课没有好好记笔记,跟住老师的步伐,导致最后忘记公式的内容,进行算错补写博客的。

参考资料

原文地址:https://www.cnblogs.com/sanjinge/p/9817004.html