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);
    	}
    }
    
  • 相关阅读:
    [eslintpluginvue] [vue/nounusedvars] 'scope' is defined but never used.
    Vue项目中添加锁屏功能
    前端文档汇总(含代码规范、开发流程、知识分享,持续更新)
    vscode格式化Vue出现的问题
    下盘不稳 被忽视的项目风险
    项目沟通中的一点经验心得
    如何才能更合理地分配项目奖金?
    关于企业的薪酬体系之思考
    导致项目失败的两大隐形杀手
    如何让项目总结会议更有效果?
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5994430.html
Copyright © 2011-2022 走看看