请用分治算法求解一个包含n元素的数组中最大元素的位置请用分治算法求解一个包含n元素的数组中最大元素的位置请用分治算法求解一个包含n元素的数组中最大元素的位置
1)对所有元素分成两组,中间下标记为mid=(low+high)/2,使用自定义的findmax函数选出(low,mid)和(mid+1,high)中的最大值,而后比较选出二者间的最大值。
2)代码:
int search(vector<int>& arr) {
int low = 0;
int high = arr.size() - 1;
int loc = 0;
if(high==low)
{
return 0;
}
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] > arr[loc]) {
loc = mid;
}
if (arr[mid] < arr[mid + 1]) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
return loc;
}
int main() {
int n;cin>>n;
vector<int>arr(n,0);
for(int i=0;i<n;++i)
{
cin>>arr[i];
}
int loc = search(arr);
cout << loc << endl;
return 0;
}
3)时间复杂度:
T(n)=2*T(n/2)+5; (n>1)
T(1)=O(1); (n=1)
对于n>1时,令a=2,b=2,f(n)=5=nlog2(2−1)n^{log_{2}(2-1)}nlog2(2−1)
则T(n)=O(n).
2.设X, Y是两个n位的十进制数,求X*Y。请写出它的算法描述
算法描述:
输入:两个n位十进制数
输出:乘积
multi(x,y)
{
if(x==0||y==0) return 0;
if(n==1) return x*y;
n<- n/2;
x1<- x / (int)pow(10,n) ,x0<- x % (int)pow(10,n);
y1<- y/ (int)pow(10,n),y0<- y % (int)pow(10,n);
xy1<- multi(x1,y1);
xy0<- multi(x0,y0);
sum<- (x1-x0) * *(y0-y1);
return xy1* **pow(10,(2* * half) ) + (sum+xy1+xy0)*pow(10,half) +xy0;
}
核心操作:
代码:
long long multi(long long num1,long long num2)
{
if(num1<10 ||num2<10)return num1*num2;
int size1=ceil(log(num1)/log(10));
int size2=ceil(log(num2)/log(10));
int mid=max(size1,size2)/2;
long long x1=num1 / (int)pow(10,mid) ,x0= num1 % (int)pow(10,mid);
long long y1=num2/ (int)pow(10,mid),y0=num2 % (int)pow(10,mid);
long long xy1=multi(x1,y1);
long long xy0=multi(x0,y0);
long long sum= (x1-x0)*(y0-y1);
return xy1*pow(10,(2*mid) ) + (sum+xy1+xy0)*pow(10,mid) +xy0;
}
时间复杂度:T(n)=3∗T(n/2)+c∗nT(n)=3*T(n/2)+c*nT(n)=3∗T(n/2)+c∗n
设a=3,b=2,f(n)=c∗na=3,b=2 ,f(n)=c*na=3,b=2,f(n)=c∗n, , f(n)=f(n)=f(n)=
则取ε=log23/2>0ε=log_{2}3/2>0ε=log23/2>0 得到
1)普通的二分法主要代码:
void bs(int n,Mat a,Mat b,Mat c)
{
if(n==1)
{
c.m[0][0]=ma.m[0][0] * mb.m[0][0];
return ;
}
else if(n==2)
{
c.m[0][0]=a.m[0][0]*b.m[0][0]+a