算法设计与分析第二章

本文介绍了如何使用分治法求解最大字段和问题,详细阐述了三种关键情况,并提供了相应的递归代码实现。通过递归与合并,实现了O(nlogn)的时间复杂度。讨论了分治法的优势及其在解决复杂问题中的应用,提倡在实际中灵活运用分治思想。
摘要由CSDN通过智能技术生成

一、 最大字段和分治法

在用分治法求解最大字段和问题时,可以大致分为以下三种情况:

  1. 当最大子段和位于数组最左边的时候
  2. 当最大字段和位于数组最右边的时候
  3. 当最大子段和包含所选的界定值,也就是在界定值的两侧的时候

第一种情况,当最大子段和位于数组最左边的时候,通过不断地递归,保留最大的子段和,最后相加
第二种情况,当最大子段和在数组右边的时候,也是通过不断地递归,最后相加
第三种情况,当界定值包含在最大子段和中的时候,取得的界定值往左右两边分别寻找,最后相加
 

代码如下: 

 附上代码段:

int maxSum(int a[], int left, int right)
{
	int sum=0;
	if(left==right)          //临界条件 
	{
		if(a[left]>0) sum=a[left];
		else sum=0; 
	}
	else
	{
		int mid=(left+right)/2;
		int leftSum=maxSum(a,left,mid); //递归求取左边最大字段和 
		int rightSum=maxSum(a,mid+1,right); //递归求取右边最大字段和 
		int s1=0; 
		int left1=0;
		for(int i=mid;i>=left;i--)      //界定值左边最大和 
		{
			left1+=a[i];
			if(left1>s1) s1=lefts;
		}
		int s2=0; 
		int right2=0;
		for(int i=mid+1;i<right;i++)  //界定值右边最大和 
		{
			right2+=a[i];
			if(right2>s2) s2=right2;
		}
		sum=s1+s2;                        //中间字段最大和 
		if(sum<leftSum) sum=leftSum;	
		if(sum<rightSum) sum=rightSum;
	}
	return sum;
}

二、最大字段和分治算法时间复杂度分析 

分解子问题时间复杂度为O(1),求解子问题时间复杂度为2T(n/2),合并子问题算法时间复杂度为O(n)

根据主定理得:T(n)=2T(n/2)+O(n)=O(nlogn)

三、对分治法的体会与思考

分治法的基本做法是将规模为n的问题分解为k个规模较小的问题,这些子问题相互独立且与原问题相同,通过递归解决子问题并合并得到原问题的解。
与原问题相比,分治法时间效率得到优化。
分治法中最重要的是递归的思想。
通过学习分治法,一些问题规模较大的问题得到了高效的解决。除了课堂所学的示例,实际生活中也有许多问题需要用到分治的思想。在以后的学习生活中也要活学活用。 
《知到app算法设计与分析》是一本讲述算法设计与分析的教材。通过阅读这本教材,我们可以了解到算法设计的基本概念、算法的分类、算法分析的方法以及常见的数据结构算法问题。 在第二章中,主要介绍了算法的基本概念和算法分析的方法。首先,算法的定义是一组完成特定任务的有限步骤集合。算法要具备以下特点:明确性、有限性、确定性和有效性。然后,根据算法的执行顺序,可以将算法分为序列、选择和循环结构。序列结构是指算法按照一定顺序执行,选择结构是根据条件选择执行不同的代码块,循环结构是重复执行某段代码。 接下来,教材介绍了算法分析的方法。算法分析主要用于评估和比较不同算法的性能。常见的算法分析方法包括时间复杂度和空间复杂度。时间复杂度表示算法执行所需的时间,可以通过估计算法中基本操作的执行次数来进行评估。空间复杂度表示算法执行所需的额外存储空间,也可以通过估计变量和数据结构的存储量来进行评估。我们通常关注算法的最坏情况时间复杂度,即算法在最差情况下执行所需的时间。 此外,第二章还介绍了算法思维和算法设计的一些基本原则。算法思维是指通过分析问题、抽象问题和抽象解决方法来解决问题的能力。而算法设计的基本原则包括自顶向下的设计、递归和迭代的设计、模块化设计和算法的优化等。 总之,第二章主要介绍了算法的基本概念、算法分析的方法以及算法设计的一些基本原则。通过阅读和理解这些内容,我们可以更好地了解和应用算法设计与分析的知识。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值