实验报告

姓名:凌玉霖   学号:20191003117   班级:软件工程1803

 

1、实践题目:pta第二题,改进二分搜索算法

 

2、问题描述:设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

 

3、算法描述:

 

整体框架:

1)首先,还是和第一题一样的二分搜索框架,调用递归来实现二分搜索。

递归实现二分搜索具体步骤:先判断所找数是否在数组中,若在就把这个数和该已排序好的数组的中间数对比,若小于中间数,则下次递归区间为最小数和中间数-1,并且重新计算该新区间的中间数,一直递归;若大于中间数,则下次递归区间为中间值+1和最大值,后面步骤和小于中间值情况一样。当递归到找到所找值则结束递归,若找不到则到下面的限制条件。

2)其次,是限制条件,判断所要搜索的数在不在数组中,若不在数组中,又分三个情况,第一是在数组的最大和最小值的区间内,这时候就需要通过比较输出此数在数组中左右两边的位置;第二是比最小的还小,此时直接return -1;比最大的还大,直接输出n和n-1的值。该源代码中把在区间内和比最大的都大的合并为一种。

3)主函数就正常输入数组,按照格式,再调用改进后的二分搜索函数。

 

4、算法时间及空间复杂度分析

 

该源代码递归的次数和深度都是log2 n,每次所需要的辅助空间都是常数级别,故:

1)时间复杂度:O(log2 n)

2)空间复杂度:O(log2 n)

 

 

5、心得体会

 

此处上机课还是略有坎坷!初次看见第一题很是亲切,想调用递归来完成此次二分搜索。一开始很快就完成了代码的敲写,本以为遥遥领先的我们突然倒在了统计次数上面,这使得我们两非常的难受,一直都卡着(非常想用此方法解决,但是时间就是这样浪费了)。后来看到许多人使用while迭代完成了第一题。还好我们在剩下的时间里赶紧敲完了第二题,这一题我们还是用二分递归解决了,非常非常的开心(但是第三题没有做)。这次两题都涉及了二分搜索算法,使我加深了对该算法的熟悉度,并且无论是第一题还是第二题,都涉及所要找的数是否在数组内的问题,这就是锻炼写程序的健壮性,能够让我多去思考这些边界问题,包括第二题中所找数不在数组内也还可以分三种情况,就对一个问题的再细分化,能够更加看懂一个问题,使其更加完善。另外,两人上机课现场做题,那种一起思考问题,两人一起探讨,多些想法,更能完善一个算法或者程序,因为人多力量大,每人的思维可能会有差异,两个思维一起的时候能想到的方面就多了。一个人边敲代码,另外一个人边帮忙改错也是一件很高效的事情。同时也是一个相互学习的过程。