算法第二章上机实验报告

实验报告

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

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

3、算法描述:

整体框架:

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

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

2)其次,是限制条件,判断所要搜索的数在不在数组中,若不在数组中,又分三个情况,在数组的最大和最小值的区间内、比最小的还小、比最大的还大。然后判断完就分别实现各自需要输出的东西。该源代码中把在区间内和比最大的都大的合并为一种。

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

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

该源代码递归的次数和深度都是log2 n,每次所需要的辅助空间都是常数级别,故:
1)时间复杂度:O(log2 n)
2)空间复杂度:O(log2 n)

5、心得体会

这次完成得不是很满意,一直在第一题卡着,很多人都是用迭代法实现二分搜索,而我们小组是用递归法实现,就涉及统计比较次数的问题,当所找的数不在数组中时的统计次数总有问题,这里卡了很久不会改,导致没多少时间做后面的题。最后在下课前完成了第二题,很开心。这次两题都涉及了二分搜索算法,使我加深了对该算法的熟悉度,并且无论是第一题还是第二题,都涉及所要找的数是否在数组内的问题,这就是锻炼写程序的健壮性,能够让我多去思考这些边界问题,包括第二题中所找数不在数组内也还可以分三种情况,就对一个问题的再细分化,能够更加看懂一个问题,使其更加完善。另外,两人上机课现场做题,那种一起思考问题,两人一起探讨,多些想法,更能完善一个算法或者程序,因为人多力量大,每人的思维可能会有差异,两个思维一起的时候能想到的方面就多了。并且,一人打代码,另一个人看的时候也能看出一些小错误就能够及时修正,不会让它误了事。以上。

posted @ 2019-09-22 23:18  ErwinGluttony  阅读(155)  评论(0编辑  收藏  举报