算法第二章总结与思考

软工2103严有智 2022-09-25 23:58:46

一.总结与思考

 

       在我们日常生活中,经常碰到一些复杂的事物,比如存储一大批货物等。在一般情况下,我们都不会一个人去处理这些事物,可能是分了很多个人处理,或者分成几批去处理。在我们程序设计中,也很经常处理一些规模比较大,我们整体去处理的话可能比较麻烦,分治法就能很好地去解决,比如汉诺塔问题,大整数的乘法以及棋盘覆盖问题。

       分治法的基本思想是将一个规模为n的问题分解为k个规模比较小的子问题,这些子问题互相独立且与总问题一致。在这一章节的学习与编程中,我们十分频繁地使用分治法,二分搜索,归并等。分治法减少了我们的运算量,优化了程序效率。

 

二.最大子段和

(1)首先我自己做这道题的时候没有使用分治法,比较简单直接,大概属于动态规划

主要就是用一个过渡的sum来求最终的sum,每当新段和大于原sum,新和直接赋值给旧sum

算法复杂度为O(n^2)


int enumerationMethod(int a[],int n)
{
	int finalLeft = 0;
	int finalRight = 0;
	int finalSum = 0;
	for (int i = 0; i < n; i++) {
		int transitionalSum = 0;
		for (int j = i; j < n; j++) {
			transitionalSum += a[j];
			if (transitionalSum > finalSum) {
				finalSum = transitionalSum;
				finalLeft = i;
				finalRight = j;
			}
		}
	}
	return finalSum;
}

(2)分治法

如果使用分治法的话,子区间求最优和的情况:(1)[left,mid]; (2)[mid,right]; (3)处于两个区间;以上三种情形的最大者,即为所求. 前两种情形符合子问题递归特性,所以递归可以求出. 对于第三种情形,则需要单独处理. 第三种情形跨区间,可以利用穷举的思路求出:

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

434

社区成员

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

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