数据结构预习报告

文章描述了一个赛事管理系统的设计要求,包括管理参赛队伍信息、二叉排序树查找、按学校查询团队、决赛叫号模拟和路径导航服务。系统需具备增删改查功能,使用二叉排序树优化查找效率,并实现多线程决赛叫号模拟以及最短路径的Floyd算法。
摘要由CSDN通过智能技术生成

1.问题定义:

本次课程设计要求协助中国大学生计算机设计大赛江苏省组委会,设计一款赛事管理系统,实现赛务相关的数据管理及信息服务,该系统能够为省级赛事管理解决以下问题:

(1)从team.txt中读取参赛队伍的基本信息,能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。

(2)实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时的平均查找长度ASL;否则,输出“查找失败!”。请输出ASL(成功)的计算公式和结果值。 (3)能够提供按参赛学校查询参赛团队,根据提示输入参赛学校名称,若查找成功,输出该学校参赛的所有团队的基本信息,输出的参赛团队需有序输出(按参赛队编号)。(排序算法可从选择排序、插入排序、希尔排序、归并排序、堆排序中任意选择,并为选择算法的原因做出说明。)

(4)为省赛现场设计一个决赛叫号系统。所有参赛队按赛事组织文件中的赛事类别分到9个决赛室,决赛室按顺序叫号,被叫号参赛队进场,比赛结束后,下一参赛队才能进赛场。请模拟决赛叫号系统,演示省赛现场各决赛室的参赛队进场情况。(模拟时,各参赛队进场比赛时间可设为0.5秒)

(5)赛事系统为参赛者提供赛地的校园导游程序。为参赛者提供各种路径导航的查询服务。以我校长山校区提供比赛场地为例,(请为参赛者提供不少于10个目标地的导航。可为参赛者提供校园地图中任意目标地(建筑物)相关信息的查询;提供图中任意目标地(建筑物)的问路查询,即查询任意两个目的地(建筑物)之间的一条最短的简单路径。

2.问题分析

关于赛事管理系统的需求说明,需要实现以下五个功能: 

1. 参赛队伍信息管理(增加、删除、修改);

2. 基于二叉排序树的参赛队伍信息查找,并输出 ASL;

3. 按参赛学校查询参赛团队,输出有序的参赛团队信息;

4. 省赛现场决赛叫号系统模拟;

5. 赛地导游及路径导航查询服务。

3.概要设计

需求说明,这些功能大致需要以下模块: 

1. 参赛队伍信息管理:
   - 文件读写模块:读取和存储参赛队伍的基本信息;

 需要先创建一个team类存储队伍的基本信息。

读取team.txt文件中的参赛队伍信息,需要进行以下步骤:

创建Read类。它利用Apache POI库读取Excel文件中的数据,并将读取的数据存储在Team对象列表中。具体过程如下:

1. 创建一个ArrayList对象,用于存储Team对象。

2. 在create() 方法中,首先创建一个文件输入流对象fip,以读取Excel文件。然后,将文件输入流fip传递给XSSFWorkbook对象wb,以便读取目标工作簿的内容。

3. 接下来,通过调用wb.getSheetAt(0)方法,获取目标工作表的引用。这里假设目标工作表是第一个工作表。

4. 使用for循环逐行遍历目标工作表,获取每行的单元格数据。

5. 通过调用row.getCell(列索引) 方法,获取每个单元格的数据。

6. 依次获取每行的各个数据项,并将其存储在Team对象中。

把参赛队的信息作为类的成员变量,进行存储。同时使用二叉排序树将各个Team对象存储,同时编写对参赛队的增删查改操作。

- 用户界面模块:通过图形或控制台界面,提供增加、删除、修改参赛队伍信息的功能;

Team类 用于存储各个参赛队的详细信息,如编号、作品名称等,该类还提供了相应的get,set方法;

public class Team{
   
int number;
    String workName;
    String school;
    String category;
    String name;
    String teacherName;
      }
   
public Team(Integer number, String workName, String school, String category, String name, String teacherName) {
       
this.number = number;
       
this.workName = workName;
       
this.school = school;
       
this.category = category;
       
this.name = name;
       
this.teacherName = teacherName;
    }

2. 参赛队伍信息查找:
   - 二叉排序树模块:实现二叉排序树的基本操作,包括插入、删除、查找等;
   - 用户界面模块:通过图形或控制台界面,接收用户输入,并输出查找结果及 ASL;

1. 需要设计一个Node类,用来表示二叉排序树的每个节点,包括节点值、左子节点和右子节点等信息。

2. 需要设计一个Teams类,用来表示参赛队伍的集合,并提供对集合的相关操作,其中实现基于二叉排序树的查找方法。

3. 需要设计一个Main类,用来实现输入参赛队编号,并输出相应的参赛队伍信息和ASL(成功)的计算表达式和结果值等功能。

核心算法如下:

1. 实现基于二叉排序树的查找:递归地比较查找值与节点值的大小,如果查找值小于节点值,则继续在左子树中查找;如果查找值大于节点值,则继续在右子树中查找;如果查找值等于节点值,则返回相应的参赛队伍信息。

2. 计算平均查找长度ASL:由于题目已提供了sum和count两个变量,因此可以通过在查找方法中递归地将sum和count值进行累加,最后计算平均查找长度ASL。其中,ASL的计算表达式为ASL = sum / count。

3. 参赛团队信息查询:
   - 线性表模块:存储参赛团队的基本信息,并实现按参赛队编号排序的功能;
   - 用户界面模块:通过图形或控制台界面,接收用户输入并输出查询结果;

1. 需要设计一个Teams类,用于表示参赛队伍的集合,并提供对集合的相关操作,其中实现了按照参赛队编号和参赛学校查询的方法。

2. 需要定义一个对参赛队伍集合按照参赛学校进行二叉排序的方法。该方法遍历参赛队伍集合,将参赛队伍按照参赛学校的首字母进行二叉排序,并返回排序后的二叉排序树。

3. 在Main类中,输入参赛学校名称,并调用Teams类的查找方法,查找参赛学校对应的参赛队伍信息,并按照参赛队编号顺序有序输出参赛团队的基本信息。输入参赛学校名称,并调用Teams类的查找方法,返回查找结果

4.对查找结果中的参赛队伍按照参赛队编号进行排序,并按照有序的顺序输出参赛团队的基本信息。

4. 现场决赛叫号系统模拟:
   - 用户界面模块:通过图形或控制台界面,模拟决赛叫号并展示参赛队伍进场情况;

1定义一个Call类,作为决赛叫号系统的核心部分,包括分派参赛队到各个决赛室、决赛室叫号、参赛队进场等功能,并具有与线程相关的方法。

2. 需要定义一个Main类,并在该类的main方法中创建Call对象。启动多个线程分别模拟每个决赛室的叫号过程,同时输出决赛室内参赛队的进场情况/

核心算法如下:

1. 分派参赛队到各个决赛室:将参赛队根据队伍编号进行分组,分别分配到对应的决赛室中。每个决赛室是一个线程,每个线程中有一个队列queue对象,可以做到先进先出各自执行自己的叫号过程。

2. 决赛室叫号:按照参赛队编号顺序依次叫号,调用sleep方法来模拟参赛队进场的时间。当当前号码的参赛队进场后,下一支参赛队伍才能被叫号进场。

通过多线程的方式模拟决赛叫号系统的运行,可以提高系统运行效率。同时,线程的并发执行也能更加准确地模拟现实情况,增加程序的真实性。

5. 赛地导游及路径导航查询服务:
   - 地图模块:包括显示校园地图及各地标的信息;
   - 路径导航模块:实现从起点到终点的最短路径搜索及输出;
   - 用户界面模块:通过图形或控制台界面,提供各种导航及查询功能,如根据目的地查询其相关信息、查询两个目的地之间的最短路径等。

这显然是一个图论问题,而且校园内道路一般是双向通行的,所以这是一个无向图。对于图的存储结构而言,图中各个景点的存储结构有邻接表和邻接矩阵两种存储结构,考虑到顶点个数少于50个,所以邻接表和邻接矩阵的复杂度相同。本题中选择使用邻接矩阵来表示图。

任务中要求求解出图中景点的问路查询,即为给定两个源点,求解出两个顶点之间的最短路径。根据数据结构课程所学知识,有多种经典算法可以解决最短路径问题,包括Dijkstra算法,Floyd-Warshell算法,Bellman-Ford算法和深度优先遍历。不同是算法有不同的算法复杂度,考虑到校园中道路没有负权边,即算法均可解决最短路径问题。

其中Dijkstra算法求的是单源最短路径:即从一个结点出发到其它所有结点的最短路径,算法的时间复杂度为O(n2),但题目要求任意两个结点的最短路径,所以还是要在外层增加一个循环,以求得多源最短路径。

而Floyd算法求的是多源最短路径:即从任意结点出发到其它所有结点的最短路径,算法的时间复杂度为O(n3),它可以一次性求得所有结点间的最短路径,且算法思想简单,便于理解。所以我们这一项目采用Floyd算法来求解最短路径。

public void floyd() {
       
int len = 0;

       
for (int k = 0; k < edges.length; k++) {

           
for (int i = 0; i < edges.length; i++) {
               
for (int j = 0; j < edges.length; j++) {
                   
len = edges[i][k] + edges[k][j];                    

if (len < edges[i][j]) {
                       
edges[i][j] = len;
                       
pre[i][j] = pre[k][j];                    }
                }
            }
        }
    }

  for (int i = 0; i < edges.length; i++) {
           
for (int j = 0; j < edges[i].length; j++) {
               
edges[i][j] = N;
            }
        }
       
this.pre = new int[10][10];//pre数组初始化,注意存放的是前驱顶点的下标
       
for (int i = 0; i < 10; i++) {
           
Arrays.fill(pre[i], i);
        }


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值