分治算法

分治算法的设计模式

基本思想

把复杂问题分解成若干互相独立容易求解的子问题

经典问题

  1. 二分搜索

  2. 大整数乘法

  3. 棋盘覆盖

  4. 合并排序

  5. 快速排序

  6. 线性时间选择

  7. 最接近点对问题

  8. 循环赛日程表

  9. 汉诺塔

基本步骤

  1. 分解:将原问题分解成若干规模小的,相互独立,与原问题形式相同的子问题

  2. 解决:将子问题规模较小而容易被解决则直接解决,否则递归的解各个子问题

  3. 合并:将各个子问题的解合并成原问题的解

设计模式

Divide-and-Conquer(P){
   if |p| <= n~0
  then return(ADHOC(p))
//将 p分解为较小的子问题p1,p2,p3...pk
for i<---1 to k
  do yi<---Divide-and-COnquer(pi) //递归解决pi
T <---MERGE(y1,y2,...,yk)//合并子问题
return(T)
}

  • |p|表示问题p的规模

  • n0为阈值,表示当问题p的规模不超过n0时,问题已容易直接接触,不必再继续分解

  • ADHOC(p)时该分治法中的基本子算法,用于直接解小规模的问题p

  • 因此,当p的规模不超过n0时直接用算法ADHOC(p)求解

分治法解决汉诺塔实例

思路分析

  1. 如果只有一个盘,A - >C

  2. 如果盘n > = 2,总是可看作两个盘1.下面的盘,2.上面的所有盘

  3. 先把最上面的盘A - > B

  4. 把最下边的盘A - > C

  5. 把B塔的所有盘从B - > C

代码实现

package com.why.divide_and_conquer_algorithm;

import java.util.concurrent.CountDownLatch;

/**
* @Description TODO 分治法解决汉诺塔问题
* @Author why
* @Date 2020/11/13 15:34
* Version 1.0
**/
public class HanoiTower {
   public static void main(String[] args) {
       hanoiTower(5,'A','B','C');
  }

   /**
    * 汉诺塔的移动方法
    * 使用分治算法
    * @param num
    * @param a
    * @param b
    * @param c
    */
   public static void hanoiTower(int num,char a,char b,char c){
       //如果只有一个盘
       if(num == 1){
           System.out.println("第1个盘从 "+ a + "->" + c);
      }else {
           //最上面的盘A->B,移动过程会使用到c
           hanoiTower(num - 1,a,c,b);
           //最下边的盘A->C
           System.out.println("第"+ num + "个盘从 " + a + "->" + c);
           //把B塔的虽有盘从 B -> C 移动过程使用到a塔
           hanoiTower(num - 1,b,a,c);
      }

  }
}

算法(Java实现)—— 分治算法的更多相关文章

  1. 算法 | Java 常见排序算法(纯代码)

    目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...

  2. JAVA分析html算法(JAVA网页蜘蛛算法)

    近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...

  3. 排序算法-Java实现快速排序算法

  4. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

  5. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  6. 从分治算法到 Hadoop MapReduce

    从分治算法说起 要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再 ...

  7. ID3算法Java实现

    ID3算法java实现 1 ID3算法概述 1.1 信息熵 熵是无序性(或不确定性)的度量指标.假如事件A的全概率划分是(A1,A2,...,An),每部分发生的概率是(p1,p2,...,pn).那 ...

  8. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  9. Java数据结构和算法(一)--栈

    栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ...

  10. Java数据结构和算法(六)--二叉树

    什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...

随机推荐

  1. nginx转发php文件到php-fpm服务器提示502错误

    实验将php文件转发给另一个php-fpm服务器处理的时候,出现了502错误: 检查了nginx错误日志,提示: 2019/08/25 17:54:56 [error] 4742#0: *35 rec ...

  2. 如何使用iMindMap的组织图表视图?

    除了常规的发散型思维导图外,iMindMap思维导图软件还提供了辐射导图.灵感导图.组织图表等多种导图形式,供用户更好地展现事项间的层级关系,而其中的组织图表更有助于展现上下级层级关系. 组织图表可以 ...

  3. Mac支持的网络游戏有哪些?怎么支持Windows游戏?

    "游戏是这个世界上唯一能和女性争夺男朋友的东西(/滑稽,有不少女生也喜欢玩游戏)."虽然只是一句玩笑话,不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了.而网络游戏是游 ...

  4. starUML软件破解

      下载链接:http://pan.baidu.com/s/1bpnHJ8F 密码:hk3x 1.使用Editplus或者Notepad++等特殊的文本编辑器打开%StarUML_HOME%/www/ ...

  5. Java基础知识面试题(最详细版)

    刚刚经历过秋招,看了大量的面经,顺便将常见的Java常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗星表示被问到的频率 ...

  6. 方格取数(number) 题解(dp)

    题目链接 题目大意 给你n*m个方格,每个格子有对应的值 你从(1,1)出发到(n,m)每次只能往下往上往右,走过的点则不能走 求一条路线使得走过的路径的权值和最大 题目思路 如果只是简单的往下和往右 ...

  7. pyhon的6大基本数据类型

    1.数字型(Number) 1.1 整型(int) 整型包括所有的正整数,负整数还有0. 在python中所有的整型数据全部默认采用十进制进行表示,但我们还可以手动表示其他进制的整型,具体表示如下: ...

  8. ios中关于系统定位CLLocationManager的使用解析

    //1.添加定位管理委托协议 CLLocationManagerDelegate //2.初始化定位管理对象 self.locationManager=[[CLLocationManager allo ...

  9. Apache Beam,批处理和流式处理的融合!

    1. 概述 在本教程中,我们将介绍 Apache Beam 并探讨其基本概念. 我们将首先演示使用 Apache Beam 的用例和好处,然后介绍基本概念和术语.之后,我们将通过一个简单的例子来说明 ...

  10. mysql给用户赋予所有权限

    mysql给用户赋予所有权限(包括远程连接) 我们给mysql新创建的用户,希望它拥有更多权限,比如远程连接,方便我们操作,可以使用如下命令: GRANT ALL PRIVILEGES ON *.* ...