算法第二章实践报告

        关于本次小组合作,实践报告主要是第一个代码——二分法。

        先介绍一下小组组员,分别是我,李卓蓉和唐伟严。

        第一个题目是给定n个非降序排列的数,用二分搜索算法查找某个数字x是否在所给数列中。这个题目看起来其实并不难,思路比较顺畅。首先我们采取二分法来进行查找,查找x。此时应当分为两种情况,一种是x存在,一种是x不存在。在x存在这种情况下,我们用二分法来寻找x的最终位置与比较次数,而x不存在的情况下,则直接输出-1与比较次数。本题比普通的二分法多了一个输出比较次数与找不到的情况下的输出。

        首先我们从x存在的情况开始讨论。x存在的时候,我们会用到循环条件来找x,首先设定一个循环条件,即什么情况下循环会一直继续呢,只要没找到x,循环就会一直进行下去,但是x如果不存在在数组当中,循环则会陷入死循环情况。这个时候怎样解决死循环问题呢?所以我们考虑,当x找不到的情况,会出现left和right的比较,当查找到数组中最后一个数时,left应当等于right,即整个数组中只剩下一个元素。如果这个元素是x,即寻找到x,如果这个元素不是x,即找不到x,循环在此处结束便不会变成死循环。此时的临界条件即为left=right,即在right-left>=0的情况下,循环会进行下去。但是我们事先并不知道这个数组有多大,也不知道这个循环会循环多少次,所以在选择循环时,我们选择了while循环而不是for循环。而循环的条件是,用x和mid比较,如果x更大,则x偏向右边,那我们就取右边的部分来进行x的查找。此时我们将原来的mid+1变成新的left,right不变,进行下一次比较。而如果是左边,则将mid变成新的right,left不变,直到找到x为止。若是此时还是没有找到x,则循环结束,输出-1的值。

       关于x的查找告一段落,那么我们如何计算它的次数呢?我们设定了一个变量为count,每循环一次便会出现一次count++,直到最后整个循环结束,输出count的值即为比较次数。

 

       第二个题目稍微有些难度,题干是设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。要求输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值。

       比起第一个题目来说,第二个在第一个的基础上减少了对次数的计算,却增加了一个比较。若是查找的x在数组中,则则输出x下标,若是x不在数组中,要寻找到数组中比x大的最小值与比x小的最大值。若x比所有数小,则输出-1 0 ,若x比所有数大,则输出n-1  n。这一次仍然是对二分法的考察,我们同样将它分为几类,一类是x存在于数组中,另一类是x不存在。x存在的情况下可以直接输出坐标,套用第一题的方法,而x不在的情况下,又分为几种情况,一种是x在数组元素中间,第二种是x小于所有元素,第三种是x大于所有元素。题目中的数组已经排好序列,所以x不存在的时候,我们很轻易能够比较它是否是最小元素或者是最大元素。那么在x是中间的情况下我们该如何进行比较呢?x在中间这种情况我们归到能寻找x的二分搜索中来计算,就会发现,搜索到最后一次还是搜索不到时,这最后一次的两个数即为比x小的最大元素与比x大的最小元素。

 

     第三个题目,再次就不做赘述。因为我们组目前讨论出来的是用merge算法来计算,此算法时间复杂度是n,不是要求的logn,所以这道题我们组算是还没有做出来。

zai 

 

你可能感兴趣的:(算法第二章实践报告)