第十四届蓝桥杯集训——练习解题阶段(无序阶段)-分治算法
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-分治算法
分治算法
百度词条解释:
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
基本思想:
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。
最简单的分治算法——二分法
利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法,例如二分法检索。
解题步骤
(1)分解,将要解决的问题划分成若干规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
分治算法例题:
汉诺塔
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
package com.item.action;
public class Demo5 {
public static void main(String[] args) {
hanoiTower(6, "A", "B", "C");
}
/**
* 汉诺塔问题
*
* @param plateNum 盘子的数量
* @param a 出发地,初始的时候是A
* @param b 中转地,初始的时候是B
* @param c 目的地,初始的时候是C
*/
public static void hanoiTower(int plateNum, String a, String b, String c) {
if (plateNum == 1) {
System.out.println("从 " + a + " 到 " + c);
} else { // 盘子数量大于等于2的情况
// 上面的从A到B
hanoiTower(plateNum - 1, a, c, b);
// 最下面那个从A到C
System.out.println("从 " + a + " 到 " + c);
// B针上的所有搬到C
hanoiTower(plateNum - 1, b, a, c);
}
}
}
移动过程
应用场景
运用分治策略解决的问题一般来说具有以下特点:
1、原问题可以分解为多个子问题
这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。
2、原问题在分解过程中,递归地求解子问题
由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。
3、在求解并得到各个子问题的解后
应能够采用某种方式、方法合并或构造出原问题的解。
总结
不难发现,在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。
相关文章
- 【NLP基础】英文关键词抽取RAKE算法
- pso粒子群优化算法_粒子群算法优化神经网络
- 雪花算法下的ID生成工具类
- 图像的拼接—-RANSAC算法
- 模拟实现银行家算法c语言
- 图像风格迁移_图像风格迁移算法
- 美团暑期实习一面:页面置换算法
- 惊雷算法3.0升级上线,持续打击刷点击作弊行为
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-2 算法训练 最大最小公倍数
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-6 算法训练 安慰奶牛 最小生成树
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
- BFS算法模板与练习
- A.机器学习入门算法(四): 基于支持向量机的分类预测
- Java数据结构和算法(八)——递归详解编程语言
- 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串详解编程语言
- 算法练习之整数反转,回文数详解编程语言
- 快速排序算法,C语言快速排序算法详解
- Linux文件快速切分算法(linux文件切分)
- Linux下安全加密:3DES算法(linux3des)
- java合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
- 算法练习之从String.indexOf的模拟实现开始