|
|
|
@ -65,8 +65,8 @@
|
|
|
|
|
主要作用:在地图上展示各个站点和线路的位置和路线。
|
|
|
|
|
用户输入:无
|
|
|
|
|
系统输出:地铁线路和站点在地图上的显示,方便用户更直观地了解线路位置和路线。
|
|
|
|
|
##2. 系统设计
|
|
|
|
|
###2.1 概要设计
|
|
|
|
|
#2. 系统设计
|
|
|
|
|
##2.1 概要设计
|
|
|
|
|
系统划分为以下模块:
|
|
|
|
|
1.用户输入模块:用户通过输入起始站点和终点站点,触发系统查询和计算。
|
|
|
|
|
2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。
|
|
|
|
@ -120,7 +120,7 @@ head -> O |weight=2| -> 1 |weight=5| -> null
|
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
|
Dijkstra算法
|
|
|
|
|
用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。
|
|
|
|
|
3. 系统实现
|
|
|
|
|
#3. 系统实现
|
|
|
|
|
系统使用C++语言进行开发,使用VScode作为开发工具。
|
|
|
|
|
本系统的文件结构如下:
|
|
|
|
|
- SubwaySystem
|
|
|
|
@ -137,7 +137,7 @@ Dijkstra算法
|
|
|
|
|
SubwaySystem::addNode(Node node):向地铁系统中添加一个节点。
|
|
|
|
|
SubwaySystem::addEdge(Edge edge):向地铁系统中添加一条边。
|
|
|
|
|
SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。
|
|
|
|
|
3.1 核心数据结构的实现
|
|
|
|
|
##3.1 核心数据结构的实现
|
|
|
|
|
数据结构的实现
|
|
|
|
|
|
|
|
|
|
本系统使用邻接表来表示地铁系统的图。具体实现如下:
|
|
|
|
@ -173,7 +173,7 @@ private:
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。
|
|
|
|
|
3.2 核心算法的实现
|
|
|
|
|
##3.2 核心算法的实现
|
|
|
|
|
系统的核心算法主要包括最短路径算法和站点搜索算法。
|
|
|
|
|
|
|
|
|
|
最短路径算法采用Dijkstra算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下:
|
|
|
|
@ -192,7 +192,7 @@ private:
|
|
|
|
|
4.重复以上步骤,直到找到终点或者没有可访问的站点。
|
|
|
|
|
|
|
|
|
|
通过以上算法的实现,我们可以实现在地铁图中查找两个站点之间最短路径和查找某个站点的所有邻居站点。
|
|
|
|
|
4. 系统测试
|
|
|
|
|
#4. 系统测试
|
|
|
|
|
系统测试思路和方法:
|
|
|
|
|
|
|
|
|
|
根据设计方案,测试系统的功能是否完备,包括地铁线路查询、路径规划、站点信息查询等。
|
|
|
|
@ -219,5 +219,5 @@ private:
|
|
|
|
|
特殊情况: 输入为空、非法字符或格式、查询的线路、站点不存在、查询的起点和终点在同一站点、查询的起点和终点不在同一线路上
|
|
|
|
|
预期结果:返回错误提示信息
|
|
|
|
|
运行结果:通过
|
|
|
|
|
5. 总结
|
|
|
|
|
#5. 总结
|
|
|
|
|
我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2),效率并不高,我通过查阅文献的方式了解到可以进一步采用优先队列的思路优化它,在存储时就按照从小到大的顺序实现,这样在选择节点时直接取队首距离最小的节点即可,可以将时间复杂度优化到O(logn)左右
|