From a0ba4280fc9d5472d59d0ce84694fefadb905075 Mon Sep 17 00:00:00 2001 From: xkm Date: Thu, 11 Jun 2026 19:28:05 +0800 Subject: [PATCH] add report --- report.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 report.md diff --git a/report.md b/report.md new file mode 100644 index 0000000..75cece8 --- /dev/null +++ b/report.md @@ -0,0 +1,105 @@ +# 经典算法实验报告 + +## 一、实验内容 + +本次完成 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]`,贪心结果 `250`,DP 最优结果 `240`。 + +结论:贪心速度较快,但不能保证最优;DP 能保证最优解。 + +### 4. 皇后问题回溯 + +算法思路:逐行放置皇后,用列数组、主对角线数组、副对角线数组判断当前位置是否冲突;若合法则继续递归,否则回溯。 + +复杂度: + +- 时间复杂度:最坏约 `O(n!)` +- 空间复杂度:`O(n)` + +测试输入 `n=8`,输出前 3 个解,并统计总解数: + +```text +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 个可行解,程序输出正确。 + +## 三、实验总结 + +本次实验验证了分治、动态规划、贪心和回溯算法的基本特点:分治适合递归拆分问题;动态规划能保证全局最优;贪心效率高但可能非最优;回溯适合枚举约束解空间,但规模增大后搜索代价较高。