算法设计与分析第二章作业

伪代码:

#include<iostream>
 
using namespace std;
 

int n;
int nums[10008];
 
int find_Max(int nums[],int left,int right)
{
    if(left>=right) return nums[left];  
	// 只有一个数 
    
    int mid=(left+right)/2;
    int Lnums_Max =  left -> mid 
	int Rnums_Max =  mid+1 -> right
    //调用find_max 找出左右侧 最大字段和
    // 情况1 2 
    
    int num1=0,lefts=0; 
    for(int i=mid-1;i>=left;i--)
    {
       //求左边最大字段和
    }
    
    int num2=0,rights=0; 
    for(int i=mid;i<=right;i++)
    {
 		//求右边最大字段和
    }
    //  num1+num2 即情况 3
	//  比较1 2 3 的值 得最大字段和 
    return //返回最大字段和 
}
 
int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>nums[i]; //输入 
    cout<<find_Max(nums,0,n-1)<<endl;  //输出 
    
    return 0;
}

算法的时间复杂度:

T(n)=2T(n/2)+O(n)

可知该算法的时间复杂度为O(nlogn)

体会和思考:

分治法可以将一个难以直接解决的大问题,划分成一些规模较小的子问题,分而破之,达到解决问题的目的。

分治算法有以下三步:

1. 将较大规模的问题分割成k个更小规模的子问题。2. 对这些子问题分别求解,不够小则再划分,直到问题规模足够小,很容易求出其解为止。3.将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解,即合并子问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值