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.但是所在的位置已经有元素了,所以我们运用的方法是:H(key)=(key+1)%m,然后判断此处所求的模的位置否有元素,如果有,则重复此操作;如果没有,元素将被放在这。
- 当被插入的位置是最后一个但此处位置已经有元素时(比如插入元素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了(从零开始数的)。