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

计科2101赵梦萍 2022-09-24 11:34:58

1.请以伪代码描述最大字段和的分治算法

   伪代码为:

   算法:findmax( a , left , right )

   输入:数组a,left,right(左,右边界)

   输出:最大子段和和sum以及子段边界

  1.      if |a| = 1 then 输出元素(值为负输出0)
  2.      mid <——[(left + right) / 2]
  3.      leftsum<——findmax(a , left , mid)
  4.      rightsum<—— findmax(a , mid + 1 , right)
  5.      s1<——a[mid]  //从mid向左
  6.      s2<——a[mid + 1] //从mid+1向右
  7.      sum = s1 + s2
  8.      if leftsum > sum  then sum <—— leftsum
  9.      if rightsum > sum  then sum <—— rightsum

   代码段如下:

int findmax(int *a , int left , int right )
{
	int sum = 0;
	if(left == right) //临界条件
	{
		if(a[left] > 0) sum = a[left];
		else sum = 0; //当都为负数时
	}
	else if(left > right) return 0;
	else
	{
		int mid = (left + right) / 2; //划分为两段
		int leftsum = findmax(a , left , mid);//递归,找左边的最大子段和
		int rightsum = findmax(a , mid + 1 , right);//递归,找右边的最大子段和
	
		int s1 = 0 , lefts = 0;
		for(i = mid ; i >= left ; i--)// 从中点向左找最大字段和
		{
			lefts += a[i];
			if(lefts > s1) s1 = lefts;	
		}
		
		int s2 = 0 , rights = 0;
		for(i = mid + 1 ; i <= right  ; i++)//从中点向右找最大字段和
		{
			rights += a[i];
			if(rights > s2) s2 = rights;	
		}

		sum = s1 + s2;// 第三种情况的最大子段和

        // 求解三种情况的最大值
		if(sum < leftsum) sum = leftsum;
		if(sum < rightsum) sum = rightsum;
	}
		return sum;
}


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

划分子问题:O(1)

求解子问题:2T(2/n)

合并子问题:O(n)

所以时间复杂度为:T(n) = O(1) + 2T(2/n) + O(n) = O(nlogn)


3.结合本章的学习,你对分治法的体会和思考

分治法主要就是将一个大规模的问题划分为多个小规模的子问题。分治法有一个临界条件,也就是最小阈值,结合递归算法将问题解决。但是分治法的子问题的规模大小也影响着其时间复杂度,所以要根据具体的情况划分子问题。

分治法的基本解决步骤为:

1.划分子问题;2.求解子问题;3.合并子问题。

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

434

社区成员

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

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