add report
This commit is contained in:
@@ -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 个可行解,程序输出正确。
|
||||||
|
|
||||||
|
## 三、实验总结
|
||||||
|
|
||||||
|
本次实验验证了分治、动态规划、贪心和回溯算法的基本特点:分治适合递归拆分问题;动态规划能保证全局最优;贪心效率高但可能非最优;回溯适合枚举约束解空间,但规模增大后搜索代价较高。
|
||||||
Reference in New Issue
Block a user