分治算法小结(Java版)

本文详细介绍了分治算法的原理,包括分治法的分解与合并过程,并列举了适合使用分治法的问题特点。文章通过折半查找、快速排序和归并排序等经典案例,深入浅出地解析了分治算法的运用。同时,提到了在处理重叠子问题时动态规划的优势。
摘要由CSDN通过智能技术生成

分治算法(divide and conquer)

算法设计思想:
分(divide):递归解决较小的问题(基本情况除外)。
治(conquer):从子问题的解构建原问题的解。

适合用分治法的问题:
当求解一个输入规模非常大的问题时,用暴力法效率一般得不到保证,如果问题能满足以下几个条件,就可以采用分治法提高解决效率:

  1. 能将这n个数据分解成k个不同的子集合,且得到k个子集合是可以独立求解的子集问题,1<k<=n
  2. 分解所得到的子问题与原问题具有相似的结构,便于利用递归或循环机制
  3. 在求出子问题的解可以推出原问题的解

对于一些重叠子问题类的题目,用动态规划是一种较好的解决办法

典型采用分治算法的例子:二分法查找,归并排序,快速排序,二叉树遍历(先遍历左子树再遍历右子树),二叉排序树的查找等算法。

下面从具体题目中理解分治算法的含义

典型算法之折半查找

public class BinarySearch {
	/**
	 * 二分查找
	 * @param num 需要查找的数组(必须为有序数列)
	 * @param n 待查找的值
	 * @param left 数组开始下标
	 * @param right	数组结尾下标
	 * @return	返回该值在数组中的位置,不存在则返回-1
	 */
	public static int Search(int[] num,int n,int left,int right) {
		int mid = (left + right) / 2;
		if(n == num[mid])
			return mid+1;			//若n等于当前中间元素则返回下标
		if(left<right) {			//如果left小于right,说明没有查找完
			if(n > num[mid])		//如果大于中间值,则从右半部查找
				return Search(num,n,mid+1,right);
			else					//否则从左半部查找
				return Search(num,n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值