数据结构课程设计项目计划书
1. 项目背景
中国大学生计算机设计大赛是我国高校面向本科生的计算机应用设计大赛,大赛旨在激发学生学习计算机知识和技能的兴趣与潜能,提高学生运用信息技术解决实际问题的综合能力。通过大赛这种计算机教学实践形式,可展示师生的教与学成果,最终以赛促学,以赛促教,以赛促创。该赛事在历届学生中影响力较大,参与者众多。
2. 项目要求
本次课程设计要求协助中国大学生计算机设计大赛江苏省组委会,设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理解决以下问题:
2.1 管理各参赛队的基本信息(见下表),实现增、删、改、查的功能
信息 | 变量 |
---|---|
参赛队编号 | ID |
参赛作品名称 | name |
参赛学校 | school |
赛事类别 | category |
参赛者 | participant |
指导老师 | instructor |
2.2 从team.txt(见下图)中读取参赛队伍的基本信息,实现基于二叉排序树的查找
- 根据提示输入参赛队编号
- 若查找成功,输出该参赛队基本信息,同时输出查找成功时的平均查找长度ASL
- 否则,输出“查找失败!”
2.3 根据参赛学校、参赛类别查询该学校或该类别所有的参赛团队
- 根据提示输入参赛学校(或参赛类别)
- 若查找成功,输出该学校(或该类别)的所有参赛队信息
- 输出信息需要按参赛类别(或参赛学校)有序输出
2.4 设计决赛叫号系统
- 共9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后下一参赛队才能进场
- 模拟决赛叫号系统,演示各决赛室进场情况,模拟时展示较好顺序与进场顺序一致
2.5 设计校园导游程序,为参赛者提供导航查询服务
- 需要为参赛者提供任意两个目的地之间的最短路径
- 长山校区地图与10个目的地的位置信息
目的地
选取10个目的地
目的地与距离数学模型
3. 解决思路
整个系统可分为三个子系统:【信息管理系统】、【决赛叫号系统】、【校园导游系统】
3.1 信息管理系统
【第一步】读取并封装原始数据,将参赛队的基本信息封装成类,每支参赛队构建一个对象
【第二步】由于参赛队总数不确定,且需要随时增减参赛队数量,本项目采用链表来对所有参赛队进行管理。与数组相比,链表具有以下优点:
- 物理地址非连续,内存利用率高
- 如果增加参赛队,不用在数组后面预留空间,可以在任意地址新增数据
- 如果删除某个参赛队,原本占有的数据空间可以直接释放
- 插入删除速度快,仅需修改指针域next即可增加、删除节点
- 大小不固定,可随意增减参赛队
但是同时,链表也需要注意以下缺点:
- 不能随机查找数据,必须从第一个开始遍历,查找效率低
链表建模如下:
【第三步】增删改只需利用链表的增加节点、删减结点、节点定位即可
【第四步】根据参赛学校查询该学校所有参赛队信息,按赛事类别分组、按参赛队编号排序输出。下面需要进行排序算法的选择,首先对比分析选择排序、插入排序、希尔排序、归并排序和堆排序的优劣
算法 | 时间复杂度 | 数据规模 |
---|---|---|
选择排序 | O(n^2) | 小规模 |
插入排序 | O(n^2) | 小规模 |
希尔排序 | 介于O(n)和O(n^2)之间 | 中等规模 |
归并排序 | O(nlogn) | 任意规模 |
堆排序 | O(nlogn) | 任意规模 |
从时间复杂度来看,选择排序、插入排序和希尔排序的时间复杂度都是O(n^2),而归并排序和堆排序的时间复杂度都是O(nlogn)。因此,在处理大规模数据集时,归并排序和堆排序具有更好的性能
从空间复杂度来看,选择排序、插入排序、希尔排序和堆排序的空间复杂度都是O(1),而归并排序的空间复杂度是O(n)。因此,如果内存空间有限,选择排序、插入排序、希尔排序和堆排序更适合
从算法稳定性来看,稳定的排序算法会保持相同元素的相对顺序不变。选择排序、希尔排序都不稳定,可能会破坏相同元素的相对顺序
五种算法的数据规模、时间复杂度、空间复杂度、算法稳定性性能对比如下图所示
本项目数据规模中等(排除选择排序)、优先考虑运算时间(在堆排序和归并排序中选择)、考虑算法稳定性,最终选择归并排序。
3.2 决赛叫号系统
-
分组工作
-
将所有参赛队平均分配(尽可能)到9个决赛室,随机分配
-
将每个房间的参赛队按参赛学校(第一级)、参赛编号(第二级)排序
-
-
叫号流程
- 赛前等待阶段,统一显示“请等待”
- 开始决赛,开始按顺序叫号“请xxxx学校xxxx参赛队入场”
- 一小段时间后(用随机数)各决赛队伍加入决赛房间,每组显示10分钟(演示时可以采用20秒)
- 某一组决赛结束,继续叫号“请xxxx学校xxxx参赛队入场”
- 某一决赛室所有组别全部结束,显示“决赛毕”
3.3 校园导游系统
-
导航地点数学建模
-
使用邻接矩阵对导航图进行建模:
0 100 0 200 0 0 0 0 0 0 100 0 80 150 0 0 0 0 0 0 0 80 0 0 120 110 0 0 0 0 200 150 0 0 50 0 0 0 0 0 0 0 120 50 0 0 0 150 230 0 0 0 110 0 0 0 80 60 0 0 0 0 0 0 0 80 0 0 0 100 0 0 0 0 150 60 0 0 90 70 0 0 0 0 230 0 0 90 0 50 0 0 0 0 0 0 100 70 50 0
-
- 找最短路径:需要找到相对最优解,采用广度优先算法