算法分析与设计期末考试

算法分析与设计期末考试

肯定有人学了一学期算法,感觉自己😖,以下就是往年常考题型,只要你看会,考试无压力。

计算题

拓展递归技术,分治递推式(主定理)分别计算时间复杂度

\[T(n)= \begin{cases} 1, & \text {n = 1} \\ 2T(n/2) + 1, & \text{n > 1} \end{cases} \]

  • 扩展递归技术

\[\begin{align} T(n) & = 2T(n/2)+1\\ & = 2(2T(n/4)+1)+1\\ & = 2(2(2T(n/8)+1)+1)+1\\ & = ...\\ & =2^kT(n/2^k)+\frac{1(1-2^k)}{1-2}\\ \end{align} \]

接下来不会了,直接写出主定理算的结果😝

\[时间复杂度为O(n) \]

  • 主定理

    \[T(n)= \begin{cases} c, & \text {n = 1} \\ aT(n/b) + cn^k, & \text{n > 1} \end{cases}\\ T(n)= \begin{cases} O(n^{\log_{b}^{a}}), & a>b^k \\ O(n^k{\log_{b}^{n}}), & a=b^k \\ O(n^k), & a < b^k \end{cases} \]

    \[\begin{align} &∵a = b = 2; k = 0\\ &∴a > b^k\\ &∴T(n)=O(n^{\log_{b}^{a}})=O(n^{\log_{2}^{2}})=O(n^{\log_{2}^{2}})=O(n)\\ &∴时间复杂度为O(n) \end{align} \]

\[T(n)= \begin{cases} 1, & \text {n = 1} \\ 4T(n/2) + n^2, & \text{n > 1} \end{cases} \]

  • 扩展递归技术

\[\begin{align} T(n) & = 4T(n/2)+n^2\\ & = 4(4T(n/4)+n^2)+n^2\\ & = 4(4(4T(n/8)+n^2)+n^2)+n^2\\ & = ...\\ & =4^kT(n/2^k)+n^2(\frac{1(1-4^k)}{1-4})\\ \end{align} \]

接下来不会了,直接写出主定理算的结果😝

\[时间复杂度为O(n^2{\log_{2}^{n}}) \]

  • 主定理

\[\begin{align} &∵a = 4; b = 2; k = 2\\ &∴a = b^k\\ &∴T(n)=O(n^k{\log_{b}^{n}})=O(n^2{\log_{2}^{n}})\\ &∴时间复杂度为O(n^2{\log_{2}^{n}}) \end{align} \]

应用题

  1. 0/1背包,重量为5

    物品 重量 价值
    1 2 11
    2 1 8
    3 3 18
    4 3 13
    • 暴力

      1 2 3 4 价值
      放入 放入 放入 放入 超重
      放入 放入 放入 超重
      放入 放入 放入 超重
      放入 放入 19
      放入 放入 放入 超重
      放入 放入 29
      放入 放入 24
      放入 11
      放入 放入 放入 超重
      放入 放入 26
      放入 放入 21
      放入 8
      放入 放入 超重
      放入 18
      放入 13

      最后解:1+3,价值29

    • 动态规划

      物品种类\背包承重 0 1 2 3 4 5
      0 0 0 0 0 0 0
      1 0 0 11 11 11 11
      1+2 0 8 11 19 19 19
      1+2+3 0 8 11 19 26 29
      1+2+3+4 0 8 11 19 26 29

      最后解:1+3,价值29

  2. 29、18、25、47、58、12、51、10排序

  • 归并

    29、18、25、47、58、12、51、10

    18、29 | 25、47 | 12、58 | 10、51

    18、25、29、47 | 10、12、51、58

    10、12、18、25、29、47、51、58

  • 快排

    29、18、25、47、58、12、51、10

    18、25、12、10、29、47、58、51

    18、25、12、10、29、47、58、51

    12、10、18、25、29、47、58、51

    12、10、18、25、29、47、58、51

    10、1218、25、29、47、58、51

    10、1218、25、2947、58、51

    10、1218、25、2947、58、51

    10、1218、25、294758、51

    10、1218、25、2947、51、58

  1. 作业调度

    作业编号 1 2 3 4 5 6 7 8
    处理时间 7 16 5 15 8 5 3 9

    三台机器

    • 贪心
      • M1:1+5+6(20)
      • M2:2+7+8(28)
      • M3:3+4(20)
  2. TSP

    从A点开始经过其他点一次且仅一次,回到A点的最短路径

    graph LR; C--5---A A--2---B B--6---D D--1---C B--8---C A--7---D
    • 动态规划

      起点\经过点集 {}
      a(起点&终点) 14(11+7>9+5=12+2)
      b到a 2 13 13 12(8+8>6+6)
      c到a 5 10 8 9(13+8>8+1)
      d到a 7 8 6 11(6+13>10+1)

      逐次的分级问题,进行动态规划

      起点规定为a,起点最后加。

      子问题:点x经过点集{}中的点一次且仅一次到a的距离。

      QQ截图20220111173307

      两条最近路线 ABDCA 和 ACDBA 最短路径为14

    • 暴力

      • ABCDA 18
      • ABDCA 14 √
      • ACBDA 26
      • ACDBA 14 √
      • ADBCA 26
      • ADCBA 18

      两条最近路线 ABDCA 和 ACDBA 最短路径为14

    • 分支限界

      • \[\left[ \begin{matrix} ∞ & 2 & 5 & 7 \\ 2 & ∞ & 8 & 6 \\ 5 & 8 & ∞ & 1 \\ 7 & 6 & 1 & ∞ \end{matrix} \right] \]

      • 上界:贪心 ABDCA 14

      • 下界:每行最小的两个数加起来除以二 [(2+5)+(2+6)+(5+1)+(6+1)]/2=14

      • [14,14]

      • graph TB; 1#lb=14 --a->b-->2#lb=14 1#lb=14 --a->c-->3#lb=14 1#lb=14 --a->d-->4#lb=16 2#lb=14 --b->c-->5#lb=18 2#lb=14 --b->d-->6#lb=14 6#lb=14 --d->c-->7#lb=14 3#lb=14 --c->b-->8#lb=20 3#lb=14 --c->d-->9#lb=14 9#lb=14 --d->d-->10#lb=14

        已经经过的路径的总长的2倍+从起点到最近未遍历城市的距离+从终点到最近未遍历城市的距离+进入/离开未遍历城市时各未遍历城市带来的最小路径成本)除以2并向上取整.

      • 1 -- [(2+5)+(2+6)+(5+1)+(6+1)]/2=14

      • 2 -- [2*2+5+6+(5+1)+(6+1)]/2=14

      • 3 -- [5*2+2+1+(2+6)+(6+1)]/2=14

      • 4 -- [7*2+2+1+(2+6)+(5+1)]/2=15.5=16 ×

      • 5 -- [(2+8)*2+1+7+(6+1)]/2=17.5=18 ×

      • 6 -- [(2+6)*2+5+1+(5+1)]/2=14

      • 7 -- 2+6+1+5=14

      • 8 -- [(5+8)*2+1+6+(6+1)]/2=20 ×

      • 9 -- [(5+1)*2+2+6+(2+6)]/2=14

      • 10 -- 2+6+1+5=14

      两条最近路线 ABDCA 和 ACDBA 最短路径为14

算法设计题

随机数生成0~100的数字,减治算法,输出猜对的次数和猜到的数字

 public static void main(String[] args) {
	
    	 int ret=(int)(Math.random()*101);
    	 Scanner input = new Scanner(System.in);
    	 	 
    	 int count=0;
    	 while(true){
    		 count++;
    		 System.out.print("请输入您猜的数字:");
    		 int num = input.nextInt();
    	  if(num>ret){
    		  System.out.println("猜大了");
    	  }
    	  if(num<ret){
    		  System.out.println("猜小了");
    	  }
    	  if(num==ret){
        System.out.println("恭喜您,猜对了,共猜了:"+count+"次");
    	  }  	  
      }
	}

7次

posted @ 2022-01-11 23:38  Faetbwac  阅读(386)  评论(0编辑  收藏  举报