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索引处
.net

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

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

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

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.参考资料

相关文章
相关标签/搜索