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

计科2101沈浩 2022-09-26 21:38:29

一、以伪代码描述最大字段和的分治算法

   1.首先判断字段内的数,若该字段只有一个整数且该整数不大于0,则最大字段为该数,若该数小于0则最大字段为1。

   2.若字段内整数个数大于一,用分治法求最大字段。

int max(int a[], int left, int right){
	int sum, maxleft, maxright;
	if (left == right)
	{
		if (a[left] >= 0)
			sum = a[left];
		else
			sum = 0;
	}
	else
	{
		int mid = (left + right) / 2;
		maxleft = max(a, left, mid);
		maxright = max(a, mid + 1, right);
	int s1 = 0, s2 = 0;
	int temp1 = 0;
	for (int i = mid; i >= left; i--)
	{
		temp1 += a[i];
        if(s1 < temp1)
        	s1 = temp1;
	}
	int temp2 = 0;
	for (int i = mid + 1; i <= right; i++)
	{
		temp2 += a[i];
           if(s2 < temp2)
            s2 = temp2;
	}
	sum = s1 + s2;
	if (sum < maxleft)
		sum = maxleft;
	if (sum < maxright)
		sum = maxright;
	}
	return sum;
} 

2.分析该算法的时间复杂度

   分解子问题的时间复杂度为O(1)

   求解子问题时间复杂度为O(n/2)

   合并子问题的时间复杂度O(n)

   总的时间复杂度为O(nlogn)

3.对分治法的体会和思考

   运用分治法,可以将一个大问题分解为若干个子问题,递归地解决各个子问题,然后将各个子问题的解合并得到原问题的解。运用分治法,虽然提高了解决问题的空间复杂度,但是却可以降低时间复杂度,从而提高解决问题的效率,递归细化问题,使问题的复杂程度降低。该方法可以在许多例子中体现,如二分搜索、合并排序、大整数的乘法、快速排序等,我们应当学习并且熟练运用该方法,以在解决这类问题时可以达到更高的效率,让代码更简洁,时间复杂度更低。

...全文
37 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧