软考——算法分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39104294/article/details/83628349

软考常考的4类算法:递归与分治,动态规划,回溯,贪心。正好最近本科在学算法设计与分析,教材是电子工业出版社的《计算机算法设计与分析(第4版)》

一、递归与分治

递归的定义:直接或间接的调用自身的算法。

递归算法需具备两个基本的条件:一个是设置递归出口,另一个是子问题必须和原问题本质相同且更为简单。

分治法:分治法的核心是见一个难以直接解决的问题,分割成一些规模较小的相同问题,逐个击破小问题,分而治之。

分治法的三个步骤:分解、求解、合并。分——治——合

1-1分治法之汉诺塔问题

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三个金刚石塔,在一个塔上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在最后一个塔上。并且规定,在小圆盘上不能放大圆盘,在三个塔之间一次只能移动一个圆盘。

简述:有a,b,c三个塔柱,初始时a柱上有n个圆盘(编号:1、2、3,……)自上而下,有小到大排列。现要求把a上的n个圆盘移到b上,并按原次序排列,移动的过程中遵守以下3个规则:

  1. 规则一:每次只能移动1个圆盘
  2. 规则二:任何时候都不允许大的圆盘压在小的圆盘上
  3. 规则三:在满足规则一、二的情况下可以移动到a、b、c任何一个塔座上

分析:

对圆盘编号1~n,数字大的圆盘比数字小的圆盘体积大。并且引入起始塔,中转塔,目标塔的概念,在算法运行的时候,这3个塔的身份可能会互相变换。
  1.如果现在在塔A上面只有1个圆盘,那么直接把圆盘移动到塔C即可;
  2.如果现在在塔A上面有2个圆盘,那么先把圆盘1从塔A移动到塔B,再把圆盘2从塔A移动到塔C,最后把圆盘1从塔B移动到塔C;
  3..……
  4.如果塔A有n个圆盘,那么需要先把圆盘n之前的(圆盘n-1~ 圆盘1)从塔A先移动到塔B,再把圆盘n从塔A移动到塔C,最后把放在塔B的(圆盘n-1~圆盘1)从塔B移动到塔C。

要想移动起始塔上的n个圆盘,那么先要移动其上的(圆盘n-1~ 圆盘1)到中转塔,要想移动(圆盘n-1~ 圆盘1)中的圆盘n-1,那么先要移动其上的(圆盘n-2~ 圆盘1)到中转塔,依次类推……直到只有一个圆盘1,那么直接移动即可。同时,因为我们的目的是把所有的圆盘移动到目标塔,所以在移动完圆盘n到目标塔之后,需要把之前放在中转塔上的(圆盘n-1~圆盘1)移动到目标塔。

下面我将分别用C++和Java来实现这个算法,争取用小黄鸭调试法把每一句都打上注释。菜鸡的自我觉悟!

java版

package com.ecjtu.ananas;
import java.util.Scanner;
class Hanoi_Towers {
	static int moveNum = 0;
	public static void main(String[] args) {

		System.out.println("请输入A塔上盘子的个数");
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		hanoi(n, 'A', 'B', 'C');
		scanner.close();
	}
	public static void move(char x, int n, char y) {
		System.out.println("第"+moveNum+"次"+"把编号为[" + n + "]盘从" + x + " 移动到 " + y);
	}
	public static void hanoi(int n, char A, char B, char C) {
		moveNum = moveNum+1;
		if (n == 1) {
			move(A, 1, C);
		} else {
			/*
			 * 步骤 ?第一步,移走最上面的盘子,剩下一个最大的 第二步,把最大的盘子移到目标盘 ?第三步,移回第一步的盘子到目标盘
			 */
			hanoi(n - 1, A, C, B);// 借助 【C】 把n-1个盘从【A】移到 【B】
			move(A, n, C);// 把最大的盘子移动到【C】
			hanoi(n - 1, B, A, C);// 借助 【A】 把n-1个盘从【B】移到 【C】
		}
	}
}

1-2最大子段和问题

shift+6输出省略号

二、动态规划法

动态规范法和分治法类似,都是将待求解问题分解册亨若干个子问题,先解决子问题,拉后从这些子问题中得到原问题的解。然而与分治法不同的地方是,动态规划法分解的子问题往往不是独立的。

动态规划法通常用于求解具有某种最优性质的问题。在这类问题中可能会有许多个可行解,每个解都对应着一个值。但是我们希望找到具有最优值(最大值或最小值)的那个解

猜你喜欢

转载自blog.csdn.net/weixin_39104294/article/details/83628349
今日推荐