算法第二章上机实践报告

实践题目:改写二分搜索算法

 

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

 

算法:

 

算法描述:该算法只需要在二分搜索算法的基础上,找出当程序没有搜索到要找的值时,有什么条件,找到了又有什么条件。在该算法中,当搜索的left和right相等了,然而要搜索的x并不等于数组a下标为left或right的值的时候,就意味着并未找到x,但这时候还需要判断x是否大于数组a的所有的值又或者小于数组a的所有的值,若大于数组a所有的值,那就需要输出n-1以及n,若小于数组a的所有的值,则需要输出-1以及0,而当x是在数组a的最大值以及最小值之间的时候,就需要输出middle以及middle+1了。

 

算法时间和空间复杂度分析:在这个改进二分搜索算法中,主要还是搜索需要用到循环折半。在二分搜索算法中,假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到2分到1结束,那么分的次数就是执行的次数,设次数为x,N*(1/2)^x=1,所以x=log(n)。而在自己的改进二分搜索算法中,在循环里不只是折半的语句,还有几个判断,所以时间复杂度为3+log(5n),所以时间复杂度为log(n)。在该算法中,数组的定义以及left、right等的定义都是在循环外,所以他们的空间复杂度为O(1),而middle值的定义在判断left是否小于等于right的循环内,所以每次都需要定义一个middle值,存在变量的分配,所以这里的空间复杂度为O(n),所以该算法的空间复杂度为O(n)。

 

心得体会:这次的课堂打代码感觉不在状态,钻牛角尖挺久的,后来还是队友解决的问题,这体会到结对编程的好处,做完这三道题后,对二分搜索算法的熟悉度又提升了不少了,所以多做做题、打打代码还是有好处的。

posted @ 2018-10-14 22:04  Joker灬丶  阅读(111)  评论(0编辑  收藏  举报