This repository has been archived on 2026-06-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
algo-homework/README.md
T
2026-06-11 19:29:17 +08:00

2.9 KiB
Raw Blame History

经典算法实验报告

一、实验内容

本次完成 4 个实验:

模块 实验
分治 1-B-1 基于分治找最大值
动态规划与贪心 2-B-1 装配线调度二分分治与 DP
动态规划与贪心 2-B-2 矩阵链乘贪心与 DP 对比
常规搜索 3-B-1 皇后问题回溯算法

二、实验过程与结果

1. 分治找最大值

算法思路:将数组二分,分别求左右子数组最大值,再取二者较大值。

复杂度:

  • 时间复杂度:T(n)=2T(n/2)+O(1)=O(n)
  • 空间复杂度:递归栈 O(log n)

测试:随机生成数组,与顺序扫描结果对比,测试通过。

基准结果:

数据规模 时间
1000 2214 ns/op
100000 215274 ns/op

结论:运行时间随输入规模近似线性增长,符合 O(n) 分析。

2. 装配线调度

实现了两种算法:

  • 动态规划:从左到右计算到达两条生产线每个工位的最小时间。
  • 二分分治:将工位从中间分成左右两段,递归计算子问题,再合并两段之间的换线代价。

复杂度:

算法 时间复杂度 空间复杂度
DP O(n) O(n)
二分分治 O(n) O(log n)

测试:对长度 1..128 的随机数据,每个长度测试 200 组,二者结果完全一致。

基准结果:

算法 n=1000 n=100000
DP 3531 ns/op 323679 ns/op
二分分治 5959 ns/op 632573 ns/op

结论:两种算法同为线性时间;本实现中 DP 更快,但需要额外数组,分治版无堆分配。

3. 矩阵链乘

实现了:

  • DP 最优算法:枚举断点,求最少标量乘法次数。
  • 贪心算法:每次优先消去最大中间维度。

复杂度:

算法 时间复杂度 空间复杂度
DP O(n^3) O(n^2)
贪心 O(n^2) O(n)

测试结果:

  • 经典样例 [30,35,15,5,10,20,25]DP 结果为 15125
  • 随机测试中未出现贪心优于 DP 的情况。
  • 找到反例:[5,6,5,4],贪心结果 250DP 最优结果 240

结论:贪心速度较快,但不能保证最优;DP 能保证最优解。

4. 皇后问题回溯

算法思路:逐行放置皇后,用列数组、主对角线数组、副对角线数组判断当前位置是否冲突;若合法则继续递归,否则回溯。

复杂度:

  • 时间复杂度:最坏约 O(n!)
  • 空间复杂度:O(n)

测试输入 n=8,输出前 3 个解,并统计总解数:

1 5 8 6 3 7 2 4
1 6 8 3 7 4 2 5
1 7 4 6 8 2 5 3
92

结论:8 皇后共有 92 个可行解,程序输出正确。

三、实验总结

本次实验验证了分治、动态规划、贪心和回溯算法的基本特点:分治适合递归拆分问题;动态规划能保证全局最优;贪心效率高但可能非最优;回溯适合枚举约束解空间,但规模增大后搜索代价较高。