算法设计与分析 5.1 分治、二分查找、大数乘法、V.Strassen、最大子段和

在这里插入图片描述

在这里插入图片描述

请用分治算法求解一个包含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(21)

则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)=3T(n/2)+cn

a=3,b=2,f(n)=c∗na=3,b=2 ,f(n)=c*na=3,b=2,f(n)=cn, n^{log_2 3-log_2 3/2} = n, f(n)=f(n)=f(n)= img

则取ε=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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值