zoukankan      html  css  js  c++  java
  • 分治算法

    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);
    	}
    }
    
  • 相关阅读:
    Python变量常量命名
    代码格式
    Python 输入输出
    数据源
    LaTeX Test
    软件工程
    eclipse-智能提示设置
    java代码里设置指定颜色常值
    命令行中Vim直接打开某行
    Vim里快速替换命令
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5994430.html
Copyright © 2011-2022 走看看