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

    浅谈分治算法

    本篇随笔讲解信息学奥林匹克竞赛中的分治算法。分治算法更多的是一种思想,不仅是一种算法本身,以后的很多高级算法和数据结构(比如分块),都是分治思想的一种应用。好好体会分治思想,对算法竞赛的思维开发非常有帮助。


    分治的概念

    分治:字面上的意思就是“分而治之”,简单来说,就是把一个难搞的大问题拆分成很多相对来讲容易搞的小问题,然后把小问题的答案合并起来,导出大问题的答案。是为分治。


    分治的适用范围

    1、首先,大问题拆成小问题一定要变得更容易解决,否则的话,大问题被拆分之后变得更难了或者并没有什么变化,还拆它干什么。

    2、拆成的问题一定是相同种类的,可以进行类比解决。即递归思想。要不然你还想把每个小问题单设计一个算法?

    3、分解之后的问题统计出的答案要对大问题的答案有所贡献。意思是说,解决小问题之后要可以合并。

    4、小问题之间要相互独立。


    分治的步骤

    我们可以用树形结构来类比分治算法的实现过程。

    假设要求解的大问题是这棵树的根节点。那么整棵树就是分治的过程,叶子节点就是我们要解决的最好的问题。

    刚才已经说过,分治的定义更多的偏向于一种思想。下面用一个例子来让大家深入地体会分治思想。

    • 全排列问题

    没错,这是一道搜索题。

    但是里面的确体现了分治思想(滑稽肯定)

    大问题是求出所有的排列方式。

    拆分成小问题就是以1开头、以2开头......以n开头。

    然后继续拆分,第二位是1,是2,是3......

    知道分到只有一个数字的时候,不再分解。

    这其实也可以类比成一棵树。每一层表示每一位可能摆放的数字。这既是做这道题的深搜“搜索树”的类比方法。也是这道题的分治思想的类比方法。

    代码就不贴了。

  • 相关阅读:
    123
    使用Rsync自动实现网站增量备份
    一文了解 Java 各发行版本及新特性
    使用java命令出现Error: A JNI error has occurred, please check your installation and try again的错误
    orElse() 和orElseGet()方法之间的区别
    第一个Hello.java出现错误:找不到或无法加载主类Hello
    位运算统计二进制整数中1的个数
    GIMP使用笔记
    使用V2R做反向代理内网穿透
    Odoo 即时通讯 IM 设计思路
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11586687.html
Copyright © 2011-2022 走看看