标签:int 复杂 语句 分治 lse 复杂度 bsp include 二分
第二章实验报告
20171003172 陈满
1.
题目来源:《计算机算法设计与分析》,王晓东
设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
输入有两行:
第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。
输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值
2.问题描述:求x与这个数组中的元素的关系
3.算法描述:
#include<iostream>
using namespace std;
int BIN(int a[],int n,int key)
{
int left=0;
int right=n-1;
int t=0;
if(key>=a[0]&&key<=a[n-1]){
while(left<=right)
{
int middle=(left+right)/2;
t++;
if(key==a[middle])
{
cout<<middle<<" "<<middle<<endl;
return middle;
}
if(key>a[middle]) left=middle+1;
else right=middle-1;
}
int j;
for(j=1; j<n; j++)
{
if(key<a[j])
break;
}
cout<<j-1<<" "<<j;
}
if(key<a[0]) cout<<-1<<" "<<0;
if(key>a[n-1]) cout<<n-1<<" "<<n;
}
int main()
{
int n,x;
cin>>n>>x;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
BIN(a,n,x);
return 0;
}
先判断元素是否在数组的区间内,然后采用二分查找判断x是否为数组内元素,是则输出middle middle;否则输出j-1,j;
然后判断x是小于数组全部元素还是大于数组全部元素
4.时间复杂度分搜索法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用O(logn)时间完成搜索任务。每执行一次while循环,待搜索数组的大小就减小一半。因此在最坏情况下,while循环被执行了O(logn)次。循环体内外运算需要O(1)的时间。因此整个算法在最坏情况下的时间复杂度为O(logn)。
空间复杂度:二分搜索法的空间复杂度为O(1)。此算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。
5.心得体会:
二分查找法更加快速便捷。
在做题过程中,样例的情况错误,后来发现是语句错了,其他没什么太大问题。
标签:int 复杂 语句 分治 lse 复杂度 bsp include 二分
原文地址:https://www.cnblogs.com/cm0809/p/9784520.html