# data-structure-algorithms-visualizer
**Repository Path**: CaiSre/dsa-visualizer
## Basic Information
- **Project Name**: data-structure-algorithms-visualizer
- **Description**: 数据结构算法可视化
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-19
- **Last Updated**: 2026-10-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DSA Visualizer
**数据结构与算法可视化**
以 SVG 动画交互式演示 21 种常见数据结构与算法
[](https://nuxt.com/)
[](https://vuejs.org/)
[](https://www.typescriptlang.org/)
[](https://tailwindcss.com/)
[](https://vitest.dev/)
[](./LICENSE)
[快速开始](#-快速开始) · [算法目录](#-算法目录) · [常用命令](#-常用命令) · [项目结构](#-项目结构) · [架构设计](#-架构设计) · [许可证](#-许可证)
---
## 📖 简介
DSA Visualizer 是一个纯前端 Web 应用,以 **SVG 动画 + 交互**方式演示常见数据结构与算法:
支持逐步播放、单步回退、速度调节与自定义输入,配合伪代码同步高亮与复杂度展示,
适合课堂教学与自学演示。
- **零后端**:无需后端服务、数据库或用户系统,`nuxt generate` 静态产物可部署至静态托管
- **可验证**:算法与可视化分离,纯函数步骤生成器、播放器、动画状态及输入解析均有独立测试
## ✨ 特性
- **21 个算法演示** —— 覆盖排序、查找、线性结构、树、图、哈希表六大类,大小顶堆分别提供入口
- **响应式学习工作台** —— 桌面常驻分类侧栏与宽屏参考栏,窄屏使用抽屉和单列布局,画布及代码支持局部滚动
- **搜索与分类筛选** —— 首页和侧栏匹配名称、英文 ID、描述及标签;首页支持分类交集筛选,并通过 URL 保存搜索和分类,刷新后恢复
- **步骤级播放器** —— 播放 / 暂停 / 单步前进 / 单步回退 / 重置 / 拖动进度;支持 0.5x、1x、1.5x、2x、4x,步骤与树过渡按倍速等比例调整
- **代码与说明页签** —— 伪代码同步高亮且仅滚动代码容器;算法说明展示复杂度、稳定性、标签和知识点,切页签不重置演示
- **排序过程动画** —— 柱状图显示数组值与稳定下标,交换步骤展示元素双向移动
- **树结构动画** —— 演示 BST 插入、查找、删除与中序遍历、AVL 旋转、大小顶堆插入与取顶;节点和连线逐帧同步,支持增删淡入淡出及连续切步
- **自定义输入** —— 编辑数组、查找目标、图边列表与权重、线性结构及哈希表操作序列;提供格式提示、校验错误和随机示例,树演示可换一组数据
- **编辑草稿保留** —— 数据或操作编辑区可折叠,折叠及切换参考页签不会丢失草稿;非法线性操作不替换当前演示
- **浅深双主题** —— 基于 daisyUI,默认浅色,支持手动切换、本地保存偏好及首屏主题初始化
- **键盘与焦点支持** —— `空格` 播放/暂停,`←` `→` 单步,`Home` / `End` 跳至首/末步;输入控件和参考阅读区保留原生按键行为,移动抽屉支持 Escape 和焦点返回
- **基础无障碍** —— 可见输入标签、关联错误提示、键盘焦点、步骤 `aria-live` 播报,尊重 `prefers-reduced-motion` 减少动态效果设置
- **图与哈希交互** —— 图节点支持拖拽并同步更新连线;图可选择起点和方向,哈希表可调整容量并观察冲突处理
- **旧地址兼容** —— `/algorithm/heap` 保留为大顶堆兼容地址,支持静态页面直接访问,目录不重复展示
### 线性结构自定义操作
在线性结构演示页中,每行输入一条操作,点击“应用操作”生成播放步骤;也可以使用“随机示例”。
单次最多 30 条,参数必须是安全范围内的整数。
- 栈:`push 10`、`pop`、`peek`
- 队列:`enqueue 10`、`dequeue`、`peek`
- 链表:`insertHead 10`、`insertTail 20`、`remove 10`、`search 20`
## 🧮 算法目录
| 分类 | 算法 | 时间复杂度 | 空间复杂度 |
| :---: | :--- | :---: | :---: |
| 排序 | [冒泡排序](https://baike.baidu.com/item/冒泡排序) | O(n²) | O(1) |
| 排序 | [选择排序](https://baike.baidu.com/item/选择排序) | O(n²) | O(1) |
| 排序 | [插入排序](https://baike.baidu.com/item/插入排序) | O(n²) | O(1) |
| 排序 | [快速排序](https://baike.baidu.com/item/快速排序) | O(n log n) | O(log n) |
| 排序 | [归并排序](https://baike.baidu.com/item/归并排序) | O(n log n) | O(n) |
| 排序 | [堆排序](https://baike.baidu.com/item/堆排序) | O(n log n) | O(1) |
| 查找 | [线性查找](https://baike.baidu.com/item/顺序查找) | O(n) | O(1) |
| 查找 | [二分查找](https://baike.baidu.com/item/二分查找) | O(log n) | O(1) |
| 线性结构 | [栈](https://baike.baidu.com/item/栈) | O(1) | O(n) |
| 线性结构 | [队列](https://baike.baidu.com/item/队列) | O(1) | O(n) |
| 线性结构 | [链表](https://baike.baidu.com/item/链表) | O(n) | O(n) |
| 树 | [二叉搜索树](https://baike.baidu.com/item/二叉排序树) | O(log n) | O(n) |
| 树 | [AVL 树](https://baike.baidu.com/item/AVL树) | O(log n) | O(n) |
| 树 | [大顶堆](https://baike.baidu.com/item/大顶堆) | O(log n) | O(n) |
| 树 | [小顶堆](https://baike.baidu.com/item/小顶堆) | O(log n) | O(n) |
| 图 | [广度优先搜索](https://baike.baidu.com/item/广度优先搜索) | O(V+E) | O(V) |
| 图 | [深度优先搜索](https://baike.baidu.com/item/深度优先搜索) | O(V+E) | O(V) |
| 图 | [Dijkstra 最短路径](https://baike.baidu.com/item/迪杰斯特拉算法) | O((V+E) log V) | O(V) |
| 图 | [拓扑排序](https://baike.baidu.com/item/拓扑排序) | O(V+E) | O(V) |
| 哈希表 | [链地址法](https://baike.baidu.com/item/散列表) | O(1) | O(n) |
| 哈希表 | [开放寻址(线性探测)](https://baike.baidu.com/item/散列表) | O(1) | O(n) |
> 名称链接指向百度百科相关词条;哈希表两种冲突处理方式参考“散列表”词条。复杂度沿用演示目录的概览标注,并非所有输入和操作的最坏情况保证:快速排序、普通 BST 和哈希表均可能退化。
>
> 为便于观察,数组最多 20 个值,线性结构最多 30 条操作,图最多 10 个节点 / 20 条边,哈希表最多 24 次操作;树使用 7 个不同值生成随机示例,不提供手动操作编辑。
## 🚀 快速开始
**环境要求**:Node.js 版本满足 Nuxt 4.6 的约束 `^22.22.3 || ^24.15.0 || >=26.0.0`,并安装 pnpm。
```bash
# 克隆仓库
git clone https://gitee.com/CaiSre/dsa-visualizer.git
cd dsa-visualizer
# 安装依赖(统一使用 pnpm)
pnpm install
# 启动开发服务器(热更新)
pnpm dev
# → http://localhost:3000
```
> 项目统一使用 pnpm 管理依赖与脚本,请保留并使用仓库中的 `pnpm-lock.yaml`。
## 📦 常用命令
| 命令 | 说明 |
| :--- | :--- |
| `pnpm dev` | 开发服务器(热更新) |
| `pnpm build` | 生产构建 |
| `pnpm generate` | 静态生成,产物输出至 `.output/public` |
| `pnpm preview` | 本地预览构建产物 |
| `pnpm lint` | ESLint 检查 |
| `pnpm typecheck` | TypeScript 类型检查(strict) |
| `pnpm test` | 运行全部单元测试 |
## 🧪 测试
使用 Vitest、happy-dom 和 Vue Test Utils 验证算法步骤生成器、播放器、树动画状态、输入解析、
目录筛选与旧堆兼容。测试包括排序终态与元素守恒、空输入及首末步边界、播放中变速、
树旋转与增删、连续切步、减少动态效果、卸载清理,以及阅读区快捷键隔离。
另有步骤数与快照内存的性能回归测试;单测不替代真实浏览器的布局、触摸和动画验收。
```bash
pnpm test # 全量运行
pnpm exec vitest run tests/sorting.test.ts # 运行单个文件
pnpm exec vitest run -t "二分查找" # 按名称过滤用例
```
## 📁 项目结构
```
app/
├── pages/ # 页面:index 目录页 + algorithm/[id] 详情页
├── layouts/ # 布局
├── components/
│ ├── controls/ # 播放控制条、输入面板(含线性结构操作编辑器)
│ └── views/ # 可视化视图(ArrayBarView / TreeView / GraphView …)
├── composables/
│ ├── useAnimator.ts # 步骤播放器状态机
│ └── useTreeAnimation.ts # 树节点与连线的统一动画状态
├── algorithms/
│ ├── registry.ts # 算法目录元数据(名称 / 复杂度 / 伪代码)
│ ├── array.ts # 数组 / 链表状态与步骤 recorder
│ ├── sorting/ search/ # 排序、查找步骤生成器
│ ├── linear/ tree/ # 线性结构、树步骤生成器
│ └── graph/ hash/ # 图、哈希表步骤生成器
├── utils/ # 输入解析、目录筛选、快捷键边界与步骤样式
└── types/ # AnimationStep 步骤协议、AlgorithmMeta
tests/ # Vitest 单元测试
```
## 🏗️ 架构设计
核心原则是**算法与可视化分离**:
```
用户输入 ──▶ 算法步骤生成器(纯函数) ──▶ Step[] ──▶ useAnimator(播放器) ──▶ 视图组件(SVG 渲染)
```
- **算法层**:纯函数,只产出步骤序列(`generateSteps(input): Step[]`),不触碰 DOM 或组件状态,
每一步携带操作后的不可变数据快照——因此可独立单元测试,回退与跳转天然可靠;
- **播放器层**:`useAnimator` 管理 `steps / currentIndex / isPlaying / speed`,
提供 play / pause / 单步 / 重置 / seek 等操作,按速度推进并在末尾自动停止;
- **动画与视图层**:组件消费当前步骤的快照与高亮目标;`useTreeAnimation` 使用同一 RAF 推进树节点与连线,处理切步中断、增删和减少动态效果,不改变算法步骤协议。
- **工作台层**:`DemoShell` 统一画布、图例、步骤说明、控制条、数据编辑和参考页签;各演示容器持有自己的播放器,不创建全局共享播放状态。
## 🌐 构建与部署
```bash
pnpm generate
```
静态产物位于 `.output/public`,包含首页、21 个规范算法页面、旧 `/algorithm/heap` 兼容页面及兜底页面。
可部署至 Gitee Pages / GitHub Pages / Vercel / Netlify / Nginx 等静态托管,无需运行后端服务。
预渲染页面支持直接访问和刷新;发布时应使用整个 `.output/public`,而非仅复制首页。
## 🤝 参与贡献
欢迎提交 Issue 与 Pull Request。
1. Fork 本仓库并创建特性分支:`git checkout -b feature/your-feature`
2. 提交前请通过本地检查:`pnpm lint && pnpm typecheck && pnpm test && pnpm build`
3. 提交 Pull Request 并描述变更动机与验证结果
## 📄 许可证
本项目采用 [Apache License 2.0](./LICENSE) 开源。
---
## 🤖 开发说明
本项目由 [CodeArts](https://www.huaweicloud.com/product/codearts.html)、[Claude Code](https://claude.com/claude-code)、[Codex](https://openai.com/codex/) 及多个大模型工具联合设计开发。