算法第二章上机实践报告

1、实践题目:

7-2 改写二分搜索算法 (20 分)

题目来源:《计算机算法设计与分析》,王晓东

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

2、问题描述:

二分搜索算法:

设a[0:n-1]是已排好序的数组,利用二分搜索法搜索x,当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。 若x小于全部数值,则输出:-1 0 ;若x大于全部数值,则输出:n-1的值 n的值。

3、算法描述:

用二分法较少地减少了比较次数。本题的基本算法思想是,先设计二分算法,查询要找的元素x,如果找到则输出所在的位置,如果未找到,则输出小于x的最大元素的位置i和大于x的最小元素的位置j,可以简化为在一个集合中寻找“最大值”和“最小值”。

流程大致为:

main()函数


 

输入数组元素个数


输入数组元素


调用改进后的二分算法查找元素并输出结果


 

改进后的二分算法为:

int BIN(int a[], int key, int n)
{
int left = 0;
int right = n - 1;
int i = 0;
int j = 0;
while (left <= right) {
int middle = (left + right) / 2;
if (key == a[middle])
{
i = j = middle;
cout << i <<" "<<j<<endl;
return middle;
}
if (key > a[middle])left = middle + 1;
else { right = middle - 1; }
}
i = right;
j = left;
cout << i<<" "<< j<<endl;
return -1;
}

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

时间复杂度:循环体内每循环一次时间复杂度减少一半且判断的时间复杂度为O(1),所以T(n)=1*T(N/2)+O(1)=O(logn);

空间复杂度:各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。

5、心得体会:

本次上机实践通过解决二分搜索问题,让我更进一步地体会到分治思想的重要性,收获很大。尤其是在分析如何才能返回最大值最小值的过程中,一开始我们一直在寻找结果与middle值之间的规律,总感觉朦朦胧胧的,后面我们一起换了一种思路,去找最后一次left>right时,联系middle寻找left和right与大小值之间的关系,就这样我们解决了这道题。我们在结对编程的过程中,互相学习,一起改错,一起进步,真的很满足!

posted @ 2018-10-12 10:28  嘉兰  阅读(280)  评论(0编辑  收藏  举报