分治算法

分治算法的设计模式

基本思想

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

经典问题

  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. tp5配置引入使用redis

    1.首先你的php得是已经安装了redis扩展的 2.在tp里找到config.php配置文件,找到cache,改成下面的样子 'cache' => [ // 选择模式 'type' => ...

  2. Java 枚举 enum 详解

    本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...

  3. ABBYY FineReader 15新增编辑页面布局功能

    ABBYY FineReader 15(Windows系统) 新增编辑页面布局功能,允许用户修改PDF数字文档的页面布局,包括添加或者删除文字段落,文字块以及图片,更改段落,文字块,图片位置.添加或者 ...

  4. 详解pdfFactory的页面管理功能

    当我们将文档载入到pdfFactory 之后才发现文档中存在着一些乱页现象.那么是否需要重新整理文档后,再重新载入到软件中呢?实际上,不需要. pdfFactory专业版提供了高效的页面管理功能,用户 ...

  5. 庐山真面目之四微服务架构Consul和Ocelot简单版本实现

    庐山真面目之四微服务架构Consul和Ocelot简单版本实现 一.简介      在上一篇文章<庐山真面目之三微服务架构Consul简单版本实现>中,我们已经探讨了如何搭建基于Consu ...

  6. 关于Java中的内存屏障

    如何打破双亲委派机制 继承ClassLoader类后重写loadClass方法 如何指定自定义ClassLoader中的parent 默认parent是appClassLoader,可以通过Class ...

  7. 第四章:动态规划I

    4.1背包问题 动态规划的核心:如何构造一个高效的备忘录,提高整个问题求解的效率. 4.2最大子数组问题II

  8. 好端端的数据结构,为什么叫它SB树呢?

    大家好,今天给大家介绍一个很厉害的数据结构,它的名字就很厉害,叫SB树,业内大佬往往叫做傻叉树.这个真不是我框你们,而是它的英文缩写就叫SBT. SBT其实是英文Size balanced tree的 ...

  9. AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承

    AgileConfig轻量级配置中心自第一个版本发布不知不觉已经半年了.在并未进行什么推广的情况下收到了250个star,对我有很大的鼓舞,并且也有不少同学试用,并且给出了宝贵的意见,非常感谢他们.其 ...

  10. Kubernetes中Service的使用

    目录 简介 1. Service资源定义 1.1 Service Type ClusterIP 无头service NodePort sessionAffinity实现源地址session绑定 简介 ...