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.测试过程及结果

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

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

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

1.首先在0索引处添加序列元素11
1332964-20181020101132021-2005417728.png

2.在1索引处添加序列元素78
1332964-20181020101142851-1598084025.png

3.在10索引处添加序列元素10
1332964-20181020101153669-170328674.png

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

5.添加序列元素3到3索引处
1332964-20181020101212856-1477760443.png

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

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

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

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

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


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

1332964-20181020101303202-2051530507.png

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

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

3.参考资料

转载于:https://www.cnblogs.com/Lewandodoski/p/9820673.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值