分治算法

1、what is 分治算法?

顾名思义,分治就是分而治之的意思,就是把一个复杂的问题分为两个或更多个相同或者相似的子问题,再把子问题分为更小的子问题……直到最后可以简单到直接求解,然后把问题的解合并的得到原问题的解。

 

2、分治算法的设计思想为

将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之

 

3、分治法适用情况

1)问题的规模缩小到一定程度可以容易解决;

2)问题可以分解为若干个规模较小的相同问题;

3)子问题的解可以合并为该问题的解;

4)各个子问题间相互独立。

 

4、分治法基本步骤

Step1:划分问题:把问题的实例划分成子问题。

Step2:递归求解:递归解决子问题。

Step3:合并问题:合并子问题的解得到原问题的解。

 

分治法与递归法是孪生兄弟。

 

5、可解决经典问题

(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)快速排序
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表
(10)汉诺塔

其实思想大家都懂但具体怎么用呢?

—————————————————————————————————————————

例子1:快排

从数列中取一个基准数

划分问题:把比基准数小的数放在基准数的左方,大的放在右方。

递归求解:在各个分区中重复划分。

合并问题:递归结束则排序结束。

void quickSort(int s[], int start, int end)
{
	if(end>start)
	{
		int i=start;
		int j=end;
		int x=s[start];
		
		while(i<j)
		{
			//从右到左扫描直至找到第一个比基准数小的数
			while(i<j && s[j]>x) j--;
			
			if(i<j) s[i++]=s[j];  //找到了就把他放到第i个位置
			
			//从左到右扫描直至找到第一个比基准数大的数
			while(i<j && s[i]<x) i++;
			
			if(i<j) s[j--]=s[i];    //找到了就把它放在第j个位置
		}
		s[i]=x;
		//在第i个位置放置x
		
		//递归问题
		quickSort(s, start, i-1);
		quickSort(s, i+1, end);
	}
}

 

posted @ 2016-10-24 20:20  KennyRom  阅读(356)  评论(0编辑  收藏  举报