分治算法

分治法的基本思想

定义:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

算法设计模式

DIVIDE-AND-CONQUER(P)
{
	if(|P| <= n0) //问题规模足够小,n0为规模阈值
		then SOLVE(P); //解决小问题
	subs = DIVIDE(P) //分解为子问题,subs为子问题集
	for i = 1 to subs.length()
		r[i]=DIVIDE-AND-CONQUER(subs[i]); //递归求解子问题
	return COMBINE(r); //将各子问题的解合并为原问题的解
}

将规模为n的问题分成k个规模为n/m的子问题去解。设分解阈值n0=1,且CONQUER解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题及用COMBINE将k个子问题的解合并为原问题的解需用f(n)个单位时间。则有:
在这里插入图片描述
分治法求解问题的空间复杂性:在这里插入图片描述

运用分治策略的典型例子

二分搜索技术

题目描述:给定已排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。

二分搜索算法基本思想:将n个元素分成个数大致相同的两半,取a[n/2]与x进行比较。如果相等,算法终止。如果x<a[a/2],则只在a的左半部搜索。如果x>a[n/2],则在右半部搜索。

具体算法描述(非递归)

package algorithm;

public class JavaTest3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[] {1,3,5,7,9,13,16,18,33,56};
		System.out.print(JavaTest3.binarySearch(a, 18, 10));

	}
	public static int binarySearch(int [] a, int x, int n){
		//在a[0]<=a[1]<=...<=a[n-1]中搜索x
		//找到x时返回其下标位置,否则返回-1
		int left = 0;
		int right = n-1;
		while(left <= right){
			int middle = (left + right)/2;
			if(x == a[middle])
				return middle;
			if(x > a[middle]) 
				left = middle + 1;
			else
				right = middle - 1;
		}
		return -1;
	}
}

算法分析:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Ma.01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值