20172323 2018-2019-1 《程序设计与数据结构》课堂测试报告

20172323 2018-2019-1 《程序设计与数据结构》课堂测试报告

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

1.测试内容

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

2.测试过程及结果

  • 线性查找:从列表头开始比较查找每一个元素,要么找到该元素,要么抵达列表尾得出没有该元素的结论
  • 解题:将序列内元素装入顺序表中,从头挨个查找
  • 如图:

  • 折半查找:从排序列表的中间开始查找,如果中间元素不是目标元素,根据两个元素的大小关系,再判断从列表的前一半或是后一半进行查找。每次的查找都是从当前一串数字的中间元素开始的。直到最后找到该元素或是没有找到抛出一个信息。如果中间元素是偶数个,则选择前一个元素为中间元素。
  • 解题:首先将序列元素进行从小到大的排序,从中间元素进行查找
  • 如图

  • 散列查找(线性探查法)
  • 基本思想:在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到所查元素的查找方法。
  • 线性探查:线性探查法的地址增量di = 1, 2, ... , m-1,其中,i为探测次数。该方法一次探测下一个地址,知道有空的地址后插入,若整个空间都找不到空余的地址,则产生溢出。
  • 解题:因为散列函数H(K) = K % 11,所以通过哈希函数运算得出关键字序列的存储位置。

1.首先在0索引处添加序列元素11

2.在1索引处添加序列元素78

3.在10索引处添加序列元素10

4.在1索引处添加序列元素1,但因为1索引处已经有了元素78,发生冲突,按照线性探查法,探测下一地址,如果为空则插入,所以最终1添加到2索引处

5.添加序列元素3到3索引处

6.添加2到2索引处,2索引处不为空往后移一位,3索引处依然不为空,再往后移一位,最后添加到4索引处

7.添加4到4索引处,发生冲突,往后移一位,添加到5索引处

8.添加21到10索引处,不为空,往后移一位到0索引处,注意不是添加一个11索引处,发生冲突则往后移,直到6索引处

9.最终得到哈希表,而查找每个元素所需要的比较次数如下

10.ASL= (1 + 1 + 2 + 1 + 3 + 2 + 8 + 1 )/8 = 2.375
11.错误分析:当发生冲突时,从发生冲突的那个单元开始,按照一定的次序,从哈希表中找出一个空闲的存储单元,把发生冲突的待插入关键字存储到该单元中,从而解决冲突的发生。如果是在哈希表尾的存储单元发生了冲突,则继续从0索引处开始寻找空闲存储单元,如果没有找到空闲的存储单元,则溢出,不能凭空生出一个新的索引处


  • 散列查找(链地址法)
  • 将所有相互发生冲突的同义词(哈希地址相同的关键字)存储在同一个单链表中。若干组同义词可以组成若干个单链表,可用一堆数组存放头指针
  • 解题:

所以ASL= (1 x 6 + 2 x 2)/8 = 1.25

  • 链地址法的优点:
    • 处理冲突简单,且无堆积现象,因此平均查找长度短
    • 各链表上结点空间是动态的,适合造表前无法确定表长的情况
    • 在用拉链法构造的散列表中,删除结点的操作易于实现。
    • 开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间

3.参考资料

posted @ 2018-10-20 10:15  二许  阅读(560)  评论(0编辑  收藏  举报