4.5 KiB
4.5 KiB
算法测试用例生成与自我验证平台 - 设计文档
1. 项目概述
本项目旨在构建一个集“自动出题”、“多算法求解”、“性能分析”于一体的算法学习与验证平台。通过针对特定算法问题生成随机测试数据,并使用不同复杂度的算法进行求解,验证结果一致性并对比运行效率。项目包含一个现代化 Web 前端界面,用于交互式地配置参数与展示图表。
2. 系统架构设计
系统采用 前后端分离 架构:
2.1 核心模块
后端 (Backend)
- Problem Interface (问题接口)
- 定义问题的通用接口,包括
generate_case()(生成用例),solve()(求解),verify()(验证)。
- 定义问题的通用接口,包括
- Solver Engine (求解引擎)
- 针对每个问题,实现多种算法策略(暴力、分治、DP、贪心等)。
- Performance Analyzer (性能分析器)
- 执行基准测试,验证正确性,统计运行时间。
- API Layer (API 层)
- 基于 FastAPI 提供 RESTful 接口,处理前端的配置请求并返回计算结果。
前端 (Frontend)
- Control Panel (控制面板)
- 选择算法问题(如“最大子数组和”、“0/1背包”)。
- 配置生成参数(数据规模、数值范围、稀疏度等)。
- Visualization (可视化展示)
- 使用图表库展示不同算法的时间复杂度对比曲线。
- 展示具体的测试用例数据与解题结果(用于教学演示)。
2.2 技术栈
- 后端: Python 3.x, FastAPI (Web框架), Matplotlib/Pandas (数据分析)
- 前端: React, TailwindCSS (样式), Recharts (图表可视化), Axios (网络请求)
3. 选定算法问题
问题一:最大子数组和 (Maximum Subarray Sum)
描述: 给定一个整数数组,找到一个具有最大和的连续子数组。 测试用例生成:
- 随机生成长度为
N的整数数组。 - 数值范围可配置(包含正负数)。 算法实现:
- 暴力枚举 (Brute Force): 双重循环枚举所有子数组,时间复杂度
O(N^2)。 - 分治算法 (Divide and Conquer): 递归将数组分为左右两半,最大子数组可能在左、右或跨越中点,时间复杂度
O(N \log N)。 - 动态规划 (Kadane's Algorithm): 线性扫描,时间复杂度
O(N)。
问题二:0/1 背包问题 (0/1 Knapsack Problem)
描述: 给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选择其中若干个(也即每种物品可以选0个或1个),使得物品的总价值最高。 测试用例生成:
- 随机生成
N个物品,每个物品具有重量w和价值v。 - 随机生成背包容量
C。 算法实现:
- 回溯法 (Backtracking): 递归枚举所有可能的选择情况,时间复杂度
O(2^N)。 - 动态规划 (Dynamic Programming): 使用二维或一维数组记录状态,时间复杂度
O(N \cdot C)。 - 贪心算法 (Greedy, 近似解/对比): 按价值密度排序选择(注意:0/1背包贪心法通常不能得到最优解,可作为对比项展示“错误”或“近似”的算法,或者用于对比部分背包问题)。注:本项目中为了验证正确性,主要对比回溯与DP,贪心可作为错误示范分析。
4. 目录结构规划
algorithm_platform/
├── README.md
├── DESIGN_DOCUMENT.md
├── backend/ # 后端代码
│ ├── main.py # FastAPI 入口
│ ├── common/ # 通用工具
│ │ ├── __init__.py
│ │ ├── base_problem.py
│ │ └── timer_utils.py
│ ├── problems/ # 算法实现模块
│ │ ├── __init__.py
│ │ ├── max_subarray/
│ │ └── knapsack/
│ └── routers/ # API 路由
└── frontend/ # 前端代码
├── src/
│ ├── components/ # UI 组件
│ ├── pages/ # 页面
│ └── services/ # API 调用
├── package.json
└── vite.config.js
5. 开发计划
- 第一阶段: 搭建后端核心骨架 (FastAPI + Base Classes)。
- 第二阶段: 实现“最大子数组和”算法逻辑与 API。
- 第三阶段: 搭建 React 前端框架,实现基础交互与图表组件。
- 第四阶段: 实现“0/1背包”算法逻辑,并接入前端。
- 第五阶段: 优化 UI/UX,完善性能对比的可视化报告。