算法分析与设计期末考试
算法分析与设计期末考试
肯定有人学了一学期算法,感觉自己😖,以下就是往年常考题型,只要你看会,考试无压力。
计算题
拓展递归技术,分治递推式(主定理)分别计算时间复杂度
- 扩展递归技术
接下来不会了,直接写出主定理算的结果😝
-
主定理
\[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} \]
- 扩展递归技术
接下来不会了,直接写出主定理算的结果😝
- 主定理
应用题
-
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
-
-
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、12、18、25、29、47、58、51
10、12、18、25、29、47、58、51
10、12、18、25、29、47、58、51
10、12、18、25、29、47、58、51
10、12、18、25、29、47、51、58
-
作业调度
作业编号 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)
- 贪心
-
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的距离。
两条最近路线 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次