目录
一、题目:设计分治算法求一个数组中的最大元素,并分析时间性能
三、题目:在有序序列(r1,r2,……,rn)中,存在序号i(1 <= i <=n),使得ri = i。请设计一个分治算法找到这个元素,要求算法在最坏情况下的时间性能为O(㏒₂n)。
一、题目:设计分治算法求一个数组中的最大元素,并分析时间性能
int recursion(int number[], int l, int r)
{
int x;
int m= (r+l)/2;
if(r-l==1)return number[l]; //只有一个元素
else
{
//分治法
int u=recursion(number,l,m);
int v=recursion(number,m,r);
x=max(u,v);
}
return x;
}
基本语句是:m= (r+l)/2 以及 r-l==1
T(n/2)+T(n/2)+c,因为a = 2 > 1,所以时间复杂性为O(n)
二、题目:设计分治算法求解一维空间上n个点的最近对问题
int recursion(int number[], int p, int q)
{
if(p==q)
{
return INT_MAX;
}
if(p == q-1)
return number[q] - number[p];
int mid=(p+q)/2;
int Ldis = recursion(number, p, mid);
int Rdis = recursion(number, mid+1, q);
int dis = number[mid+1]-number[mid];
int Min = Ldis < Rdis ? Ldis : Rdis;
Min = Min < dis ? Min : dis;
return Min;
}
三、题目:在有序序列(r1,r2,……,rn)中,存在序号i(1 <= i <=n),使得ri = i。请设计一个分治算法找到这个元素,要求算法在最坏情况下的时间性能为O(㏒₂n)。
void recursion(int number[], int l, int r)
{
int answer = 0;
int mid = (r+l)/2;
if(l == r)
{
if(number[l] == l) cout << l;
else cout << "没有这个元素";
}
if(number[mid] == mid)cout << mid;
else
{
if(number[mid] > mid)l = mid + 1;
else r = mid - 1;
recursion(number,l,r);
}
}