1 2 3 4

20172309_《程序设计与数据结构(下)》_课堂测试修改报告。

20172309_《程序设计与数据结构(下)》_课堂测试修改报告。

课程:《程序设计与数据结构》

班级:1723

姓名: 王志伟

学号:20172309

实验教师:王志强老师

实验日期:2018年6月13日

必修/选修: 必修

实验内容:

  • 查找算法综合示例:

实验过程及结果

  • 画出顺序查找的查找顺序表及成功查找平均长度
    • 顺序表:
序列 11 78 10 1 3 2 4 21
查找次数 1 2 3 4 5 6 7 8
  • 平均查找长度:
    ASL=(1+2+3+4+5+6+7+8)/8=4.5
  • 画出折半查找的判定树并计算出平均查找长度:

    • 首先注意:进行二分查找的必须是有序结构。 所以先排序: 1 2 3 4 10 11 21 78。
    • 其次注意取中间值时:mid = (star+end)/2 取值定义为不超过mid的最大整数。
    • 判定树:(注:第一行说明在第一次就查找到了。第二行说明在第二次找到了。以此类推···)
    • 平均查找长度:
    ASL=(1*1+2*2+3*4+4*1)/8=2.625 
    
  • 画出散列查找(线性探查法)的散列表和成功平均查找长度

    • 首先求出散列表的大小m:m一般取要排序数字的个数n的1.1~1.7倍,即1.1n<=m<=1.7n
    • 然后对每个元素分别求模:
元素 11 78 10 1 3 2 4 21
H(key)=key%m 0 1 10 1 3 2 4 10
  • 然后根据求得的mod,把元素插进去:
序列 0 1 2 3 4 5 6 7 8 9 10
查找次数 11 78 1 3 2 4 21 10
  • 这里需要注意的是:
  1. 当插入元素1时,求得的模等于1.但是所在的位置已经有元素了,所以我们运用的方法是:H(key)=(key+1)%m,然后判断此处所求的模的位置否有元素,如果有,则重复此操作;如果没有,元素将被放在这。
  2. 当被插入的位置是最后一个但此处位置已经有元素时(比如插入元素21时),此时10的位置后面没有位置!因此我们将元素从头开始放,直至有位置。我的理解是将这个散列表看成一个环形数组,然后后面没位置时,从头开始。
  • 平均查找长度:
ASL=(1+1+1+2+1+3+2+8)/8=19/8=2.375

(注:括号中的次数分别对应着原列表中元素的顺序。)

  • 用散列链表法储存元素:

    这个平均查找长度:
    ASL=(6*1 + 2*2)/8=5/4=1.25

实验过程中出现的问题:

  • 问题一:第一种方案中,当在散列表中插入元素时,满了怎么办?

  • 解决方案:当时想到这个问题感觉是这种储存方式是错的, 现在想起来是自己太傻太天真了。然后下课后吃饭的时候,想了想,散列表m取1.1n~1.7n,也就是说m永远比元素个数n大,怎么会装不下呢?

  • 问题二:我当时是这么做的

    也就是说,我当时把散列表大小创建成12个,这为什么错了呢?因为当我们把散列表大小创建成12时,相当于我们求的模为13了(从零开始数的)。

参考资料

posted @ 2018-10-20 21:58  大大的梦  阅读(136)  评论(0编辑  收藏  举报