分治算法 冷不防 2021-07-24 21:35 604阅读 0赞 # 一 分治算法介绍 # ## 1 分治法是一种很重要的算法 ## 字面上的解释是“分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… ## 2 分治算法可以求解的一些经典问题 ## * 二分搜索 * 大整数乘法 * 棋盘覆盖 * 合并排序 * 快速排序 * 线性时间选择 * 最接近点对问题 * 循环赛日程表 * 汉诺塔 # 二 分治算法的基本步骤 # 分治法在每一层递归上都有三个步骤: ## 1 分解 ## 将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。 ## 2 解决 ## 若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。 ## 3 合并 ## 将各个子问题的解合并为原问题的解。 # 三 分治(Divide-and-Conquer(P))算法设计模式 # ## 1 设计模式 ## if |P|≤n0 then return(ADHOC(P)) // 将P分解为较小的子问题 P1 ,P2 ,…,Pk for i←1 to k do yi ← Divide-and-Conquer(Pi) 递归解决Pi T ← MERGE(y1,y2,…,yk) 合并子问题 return(T) ## 2 说明 ## 其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时,直接用算法ADHOC(P)求解。算法MERGE(y1,y2,…,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,…,Pk的相应的解y1,y2,…,yk合并为P的解。 # 四 汉诺塔问题 # ## 1 汉诺塔问题是分治算法最佳实践 ## ## 2 汉诺塔的传说 ## 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 假如每秒钟一次,共需多长时间呢?移完这些金片需要5845.54亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 # 五 汉诺塔问题求解思路 # 1 如果 n =1,从A移到C。 2 如果 n >= 2,总是可以看做是两个盘。最下边的盘(1个)和上面的盘(n-1个)。然后按照下面步骤操作。 2.1 先把上面的盘(n-1个)从A移到B。 2.2 把最下边的盘(1个)从A移到C。 2.3 把B塔的所有盘(n-1个)从B移到C。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70][] # 六 代码 # /** * @className: Hanoitower * @description: 汉诺塔问题 * @date: 2021/3/29 * @author: cakin */ public class Hanoitower { /** * 功能描述:汉诺塔问题测试 * * @param args 命令行 * @author cakin * @date 2021/3/29 */ public static void main(String[] args) { hanoiTower(5, 'A', 'B', 'C'); } /** * 功能描述:使用分治算法求解汉诺塔问题:将 num 个盘,从 a 移到 c ,借助 b.假定从上到下盘的编号依次是1,2,3,4... * * @param num 盘子的个数 * @param a 第1个盘子 * @param b 第2个盘子 * @param c 第3个盘子 * @author cakin * @date 2021/3/29 */ public static void hanoiTower(int num, char a, char b, char c) { // 如果只有一个盘 if (num == 1) { System.out.println("1 from " + a + " to " + c); } else { // 如果有 n >= 2 个盘子,总是可以看做是两个盘 1-最下边的1个盘 2-上面的的 num-1 个盘 // 1 先把 上面的的 num-1 个盘从 a 移到到 b, 移动过程会使用到 c hanoiTower(num - 1, a, c, b); // 2 把最下边的盘 从 a 移到 c System.out.println(num + " from " + a + " to " + c); // 3 把 b 塔的所有盘 从 b 移到 c , 移动过程使用到 a hanoiTower(num - 1, b, a, c); } } } # 七 测试 # 1 from A to C 2 from A to B 1 from C to B 3 from A to C 1 from B to A 2 from B to C 1 from A to C 4 from A to B 1 from C to B 2 from C to A 1 from B to A 3 from C to B 1 from A to C 2 from A to B 1 from C to B 5 from A to C 1 from B to A 2 from B to C 1 from A to C 3 from B to A 1 from C to B 2 from C to A 1 from B to A 4 from B to C 1 from A to C 2 from A to B 1 from C to B 3 from A to C 1 from B to A 2 from B to C 1 from A to C [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70]: /images/20210724/dfbdaa65d545477fa9da688bbd2d3c68.png
相关 算法-分治算法 一、分治 1、定义:分治,也就是分而治之。 它的一般步骤是: ① 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样) 妖狐艹你老母/ 2024年04月08日 10:08/ 0 赞/ 230 阅读
相关 分治算法 问题描述 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的L型骨牌覆盖给定的特 约定不等于承诺〃/ 2024年02月17日 21:39/ 0 赞/ 209 阅读
相关 分治算法 思想:将原问题划分成n个规模较小,并且与原问题相似的子问题。递归解决子问题,然后合并结果 要求: 1)原问题与分解成的小问题具有相同的模式 2)小问题可以独立求解 柔情只为你懂/ 2023年06月23日 02:59/ 0 赞/ 27 阅读
相关 分治算法 [概述参考博客地址][Link 1] [算法笔记总目录][Link 2] 一、分治算法的设计思想: 1. 分–将问题分解为规模更小的子问题; 2. 治–将这些规 迈不过友情╰/ 2023年02月18日 01:52/ 0 赞/ 150 阅读
相关 分治算法 划分问题:整个问题划分成多个无关联的子问题。 递归求解:递归调用求解各个子问题。 合并问题:合并子问题的解,形成原始问题的解。 ------------------- 港控/mmm°/ 2022年12月12日 04:58/ 0 赞/ 308 阅读
相关 算法-->分治 package 分治算法; import java.util.Scanner; public class fenzhi \{ static final int MAXN 一时失言乱红尘/ 2022年06月12日 02:06/ 0 赞/ 358 阅读
相关 分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题 柔光的暖阳◎/ 2022年06月05日 06:06/ 0 赞/ 315 阅读
相关 分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题 港控/mmm°/ 2022年06月03日 02:19/ 0 赞/ 327 阅读
相关 分治算法 可能我太菜了 ,众多题解 的t0\t0 +t1\t2\2始终没看懂 分治大模拟好! include<bits/stdc++.h> using nam 妖狐艹你老母/ 2021年10月24日 00:20/ 0 赞/ 509 阅读
相关 分治算法 一 分治算法介绍 1 分治法是一种很重要的算法 字面上的解释是“分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……,直 冷不防/ 2021年07月24日 21:35/ 0 赞/ 605 阅读
还没有评论,来说两句吧...