算法(Java实现)—— 分治算法
分治算法
分治算法的设计模式
基本思想
把复杂问题分解成若干互相独立容易求解的子问题
经典问题
二分搜索
大整数乘法
棋盘覆盖
合并排序
快速排序
线性时间选择
最接近点对问题
循环赛日程表
汉诺塔
基本步骤
分解:将原问题分解成若干规模小的,相互独立,与原问题形式相同的子问题
解决:将子问题规模较小而容易被解决则直接解决,否则递归的解各个子问题
合并:将各个子问题的解合并成原问题的解
设计模式
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)求解
分治法解决汉诺塔实例
思路分析
如果只有一个盘,A - >C
如果盘n > = 2,总是可看作两个盘1.下面的盘,2.上面的所有盘
先把最上面的盘A - > B
把最下边的盘A - > C
把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实现)—— 分治算法的更多相关文章
- 算法 | Java 常见排序算法(纯代码)
目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...
- JAVA分析html算法(JAVA网页蜘蛛算法)
近来有些朋友在做蜘蛛算法,或者在网页上面做深度的数据挖掘.但是遇到复杂而繁琐的html页面大家都望而却步.因为很难获取到相应的数据. 最古老的办法的是尝试用正则表达式,估计那么繁琐的东西得不偿失,浪费 ...
- 排序算法-Java实现快速排序算法
- 递归分治算法之二维数组二分查找(Java版本)
[java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 从分治算法到 Hadoop MapReduce
从分治算法说起 要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再 ...
- ID3算法Java实现
ID3算法java实现 1 ID3算法概述 1.1 信息熵 熵是无序性(或不确定性)的度量指标.假如事件A的全概率划分是(A1,A2,...,An),每部分发生的概率是(p1,p2,...,pn).那 ...
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- Java数据结构和算法(一)--栈
栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
随机推荐
- 查看php扩展
php -m
- nginx的403权限问题
修改访问目录的权限为755 找到Nginx的配置文件nginx.conf,做如下改变: (1)将user nobody; 改为user root; (2)找到 autoindex off 更改为on ...
- 这份java多线程笔记,你真得好好看看,我还没见过总结的这么全面的
1.线程,进程和多线程 1.程序:指指令和数据的有序集合,其本身没有任何意义,是一个静态的概念 2.进程:指执行程序的一次执行过程,是一个动态的概念.是系统资源分配的单位(注意:很多多线程是模拟出来的 ...
- 使用Camtasia制作魔性抖肩舞视频
最近一首风魔各大视频网站的魔性舞蹈又来袭了!这首充满魔性节奏的舞蹈就是抖肩舞了,为了将我热爱的抖肩舞视频分享给大家,我必须使用Camtasia教程录制(Windows系统)软件来制作一个魔性抖肩舞视频 ...
- 需要登录才能下载的文件可以用Folx下载吗
用苹果电脑的小伙伴有没有发现,有时候文件即时有下载链接也还是要先登录才能下载,那这样的文件用下载器Folx还能下载码?下面小编将在Mac系统平台上,通过一篇教程教大家利用Folx 5的密码管理来保存网 ...
- FL studio系列教程(十七):FL Studio走带面板介绍
FL Studio走带面板主要是用来控制播放.录音以及调整歌曲速度的,除此之外还可以用来选择样本剪辑.下面就来详细地看一下这部分菜单. 1.样本/歌曲模式 样本/歌曲模式主要是用来切换样本和歌曲两种模 ...
- Mybatis【1】-- 第一个Mybatis程序
1.框架是什么 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面 ...
- 二:robot framework基本组成
1.RF组成:套件.用例.关键字 套件:测试用例的集合,可以是一个模块的功能点的集合.也可以是很多模块功能点的集合 用例:一般是由多个关键字组成的 关键字:测试库.资源文件.用例所在文件的关键字表 2 ...
- Bootstrap(修改中)
表格 斑马表格 <table class="table-striped"> </table> 鼠标经过表格的hover效果 <table class= ...
- JMeter 安装 启动(即中文的修改)
一.安装 (1).java 和 apache-jmeter-4.0 2.点击apache-jmeter-4.0进入bin目录,点击jmeter.bat 如果没有安装java就会出现下图 遇到上面是因为 ...