|
|
@ -6,13 +6,9 @@
|
|
|
|
3、查询某一地点到其他所有地点的最短路径
|
|
|
|
3、查询某一地点到其他所有地点的最短路径
|
|
|
|
4、查询某两个地点之间的最短路径
|
|
|
|
4、查询某两个地点之间的最短路径
|
|
|
|
|
|
|
|
|
|
|
|
`为有效地存储和处理数据,我们采用了图结构的数据结构。具体来说,我们使用邻接表存储每个站点及其相邻站点的信息,并使用哈希表存储站点名称和编号的映射关系。
|
|
|
|
为有效地存储和处理数据,我们采用了图结构的数据结构。具体来说,我们使用邻接表存储每个站点及其相邻站点的信息,并使用哈希表存储站点名称和编号的映射关系。
|
|
|
|
`为了找出两点间最短路径,采用了Dijkstra算法。
|
|
|
|
为了找出两点间最短路径,采用了Dijkstra算法。
|
|
|
|
`项目的效果从整体来看运行流畅,可以为市民提供方便、快捷的地铁路线查询和导航服务。
|
|
|
|
项目的效果从整体来看运行流畅,可以为市民提供方便、快捷的地铁路线查询和导航服务。
|
|
|
|
`任务分工及工作量占比:
|
|
|
|
|
|
|
|
|任务|人员|
|
|
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|文档资料查询|刘宇婷、翟梅瑛|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -24,11 +20,11 @@
|
|
|
|
| 25 | 25 | 25 | 25 |
|
|
|
|
| 25 | 25 | 25 | 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#1. 系统分析
|
|
|
|
## 1. 系统分析
|
|
|
|
##1.1 问题描述
|
|
|
|
### 1.1 问题描述
|
|
|
|
选择北京地铁,建立地铁站点导航地图,设计一个城市地铁导航系统。根据任意指定的两个站点,能够计算出任意两个站点之间路径长度最短的站点导航,并给出换乘方案。
|
|
|
|
选择北京地铁,建立地铁站点导航地图,设计一个城市地铁导航系统。根据任意指定的两个站点,能够计算出任意两个站点之间路径长度最短的站点导航,并给出换乘方案。
|
|
|
|
|
|
|
|
|
|
|
|
1.2 可行性分析
|
|
|
|
### 1.2 可行性分析
|
|
|
|
1.明确解决问题的关键:城市地铁导航系统主要解决的问题是用户在地铁出行过程中需要查询线路、站点等信息,以及如何计算最短路径、如何显示用户当前位置等问题。
|
|
|
|
1.明确解决问题的关键:城市地铁导航系统主要解决的问题是用户在地铁出行过程中需要查询线路、站点等信息,以及如何计算最短路径、如何显示用户当前位置等问题。
|
|
|
|
2.确定核心数据结构:城市地铁导航系统的核心数据结构是图,将每个地铁站点看作一个节点,每条地铁线路看作一条有向边,通过节点之间的连接表示地铁线路的走向和路径。使用邻接表或邻接矩阵等数据结构来存储图结构。此外,还需要存储地铁站点的位置、经纬度、名称、所属线路等信息。
|
|
|
|
2.确定核心数据结构:城市地铁导航系统的核心数据结构是图,将每个地铁站点看作一个节点,每条地铁线路看作一条有向边,通过节点之间的连接表示地铁线路的走向和路径。使用邻接表或邻接矩阵等数据结构来存储图结构。此外,还需要存储地铁站点的位置、经纬度、名称、所属线路等信息。
|
|
|
|
3.确定核心算法:城市地铁导航系统的核心算法是图论算法,主要包括 Dijkstra 算法、贝尔曼-福德算法和 A* 算法等,用于寻找从起点到终点最短路径。同时还需要对地图进行可视化说明,例如显示沿途经过的地铁站点、换乘点和线路等信息。
|
|
|
|
3.确定核心算法:城市地铁导航系统的核心算法是图论算法,主要包括 Dijkstra 算法、贝尔曼-福德算法和 A* 算法等,用于寻找从起点到终点最短路径。同时还需要对地图进行可视化说明,例如显示沿途经过的地铁站点、换乘点和线路等信息。
|
|
|
@ -43,7 +39,7 @@
|
|
|
|
(6)其他功能,例如公交线路查询、建议路径提醒等增强用户体验的功能。
|
|
|
|
(6)其他功能,例如公交线路查询、建议路径提醒等增强用户体验的功能。
|
|
|
|
|
|
|
|
|
|
|
|
总的来说,城市地铁导航系统需要综合运用数据库、图论算法、用户界面设计等多种技术和工具,才能实现方便、快速、准确的地铁线路查询和导航功能。
|
|
|
|
总的来说,城市地铁导航系统需要综合运用数据库、图论算法、用户界面设计等多种技术和工具,才能实现方便、快速、准确的地铁线路查询和导航功能。
|
|
|
|
1.3 需求分析
|
|
|
|
### 1.3 需求分析
|
|
|
|
(1)输入和输出
|
|
|
|
(1)输入和输出
|
|
|
|
输入:用户希望到达的地铁站、出发地铁站、换乘信息、线路信息等。
|
|
|
|
输入:用户希望到达的地铁站、出发地铁站、换乘信息、线路信息等。
|
|
|
|
输出:给用户提供最优路径和换乘信息,告知用户需要哪些线路和站点,预计到达时间等。
|
|
|
|
输出:给用户提供最优路径和换乘信息,告知用户需要哪些线路和站点,预计到达时间等。
|
|
|
@ -67,8 +63,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#2. 系统设计
|
|
|
|
## 2. 系统设计
|
|
|
|
## 2.1 概要设计
|
|
|
|
### 2.1 概要设计
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
系统划分为以下模块:
|
|
|
|
系统划分为以下模块:
|
|
|
@ -76,7 +72,7 @@
|
|
|
|
2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。
|
|
|
|
2.数据存储模块:系统将地铁线路和站点信息存储在一个数据结构中,并提供查询和修改功能。
|
|
|
|
3.路径计算模块:该模块通过获取用户输入的起始站点和终点站点,并利用存储在数据结 构中的地铁线路和站点信息,计算出最优路径。
|
|
|
|
3.路径计算模块:该模块通过获取用户输入的起始站点和终点站点,并利用存储在数据结 构中的地铁线路和站点信息,计算出最优路径。
|
|
|
|
4.输出模块:该模块将最优路径输出给用户,以便用户按照路径指引乘坐地铁。
|
|
|
|
4.输出模块:该模块将最优路径输出给用户,以便用户按照路径指引乘坐地铁。
|
|
|
|
2.2 数据结构设计
|
|
|
|
### 2.2 数据结构设计
|
|
|
|
通过比较邻接矩阵、邻接表、查找表和不相交集等数据结构,我们选择使用邻接表作为数据结构。邻接表具有占用空间小、查询速度快等优势,适合储存大量的地铁线路和站点信息。
|
|
|
|
通过比较邻接矩阵、邻接表、查找表和不相交集等数据结构,我们选择使用邻接表作为数据结构。邻接表具有占用空间小、查询速度快等优势,适合储存大量的地铁线路和站点信息。
|
|
|
|
邻接表
|
|
|
|
邻接表
|
|
|
|
邻接表是一种表示图形的数据结构,它用于描述地铁网络中的站点之间的连接关系。在邻接表中,每个站点对应一个链表,链表中的每个节点表示与该站点相邻的另一个站点。具体而言,我们可以用如下的结构体表示邻接表中的每个节点:
|
|
|
|
邻接表是一种表示图形的数据结构,它用于描述地铁网络中的站点之间的连接关系。在邻接表中,每个站点对应一个链表,链表中的每个节点表示与该站点相邻的另一个站点。具体而言,我们可以用如下的结构体表示邻接表中的每个节点:
|
|
|
@ -96,7 +92,7 @@ struct Station stations[MAX_STATION_NUM]; // 站点数组
|
|
|
|
在这个结构中,我们为每个站点记录了它的名称、编号和相邻节点链表的头节点指针。这样的话,我们就可以通过遍历这些链表来获取某一站点的所有邻居站点。同时,由于链表中的每个节点包含了相邻站点的编号和连接权重,因此我们也可以在搜索路径时方便地计算出经过某一条路径的总长度或换乘次数。
|
|
|
|
在这个结构中,我们为每个站点记录了它的名称、编号和相邻节点链表的头节点指针。这样的话,我们就可以通过遍历这些链表来获取某一站点的所有邻居站点。同时,由于链表中的每个节点包含了相邻站点的编号和连接权重,因此我们也可以在搜索路径时方便地计算出经过某一条路径的总长度或换乘次数。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.3 算法设计
|
|
|
|
### 2.3 算法设计
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
我们选择Dijkstra算法作为路径计算模块的核心算法。Dijkstra算法是一种广泛应用于最短路径问题上的算法,具有速度快、结果正确性高、易于实现等优势。它通过不断更新起点到每个点的最短距离,并使用优先队列维护每个点的最短距离,直到计算出终点的最短路径。
|
|
|
|
Dijkstra算法
|
|
|
|
Dijkstra算法
|
|
|
|
用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。
|
|
|
|
用户输入起点站和终点站,程序使用图论算法在地铁线路图中寻找到两个站之间的一条最短路径。此时使用Dijkstra算法找出最短路径。
|
|
|
@ -119,7 +115,7 @@ SubwaySystem::addEdge(Edge edge):向地铁系统中添加一条边。
|
|
|
|
SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。
|
|
|
|
SubwaySystem::shortestPath(Node from, Node to):计算从起点到终点的最短路径。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\\## 3.1 核心数据结构的实现
|
|
|
|
### 3.1 核心数据结构的实现
|
|
|
|
数据结构的实现
|
|
|
|
数据结构的实现
|
|
|
|
|
|
|
|
|
|
|
|
本系统使用邻接表来表示地铁系统的图。具体实现如下:
|
|
|
|
本系统使用邻接表来表示地铁系统的图。具体实现如下:
|
|
|
@ -157,7 +153,7 @@ private:
|
|
|
|
其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。
|
|
|
|
其中SubwaySystem.h和SubwaySystem.cpp分别实现了地铁系统的数据结构和算法,test.cpp实现了测试用例。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 3.2 核心算法的实现
|
|
|
|
### 3.2 核心算法的实现
|
|
|
|
系统的核心算法主要包括最短路径算法和站点搜索算法。
|
|
|
|
系统的核心算法主要包括最短路径算法和站点搜索算法。
|
|
|
|
|
|
|
|
|
|
|
|
##最短路径算法采用Dijkstra算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下:##
|
|
|
|
##最短路径算法采用Dijkstra算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下:##
|
|
|
@ -168,7 +164,7 @@ private:
|
|
|
|
4.将v标记为已访问,对于v的每个邻居站点u,如果dist[u]>dist[v]+v到u的距离,更新dist[u]为dist[v]+v到u的距离。
|
|
|
|
4.将v标记为已访问,对于v的每个邻居站点u,如果dist[u]>dist[v]+v到u的距离,更新dist[u]为dist[v]+v到u的距离。
|
|
|
|
5.重复以上步骤,直到所有站点都被标记为已访问或者没有可访问的站点。
|
|
|
|
5.重复以上步骤,直到所有站点都被标记为已访问或者没有可访问的站点。
|
|
|
|
|
|
|
|
|
|
|
|
##站点搜索算法采用DFS算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下:##
|
|
|
|
### 站点搜索算法采用DFS算法实现,该算法的时间复杂度为O(n^2),其中n为站点数。具体实现方式如下:
|
|
|
|
|
|
|
|
|
|
|
|
1.初始化visited数组。
|
|
|
|
1.初始化visited数组。
|
|
|
|
2.从起点出发,采用深度优先搜索方式,访问所有邻居站点。
|
|
|
|
2.从起点出发,采用深度优先搜索方式,访问所有邻居站点。
|
|
|
@ -202,6 +198,5 @@ private:
|
|
|
|
总距离是: 50 , 经过路径为:3--->5
|
|
|
|
总距离是: 50 , 经过路径为:3--->5
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
# 5. 总结
|
|
|
|
## 5. 总结
|
|
|
|
<span color="red">
|
|
|
|
我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2)。
|
|
|
|
我们设计的城市地铁导航系统旨在帮助用户方便快捷地查找和选择地铁线路及站点,并提供实时更新的地铁运行状态和乘车提示。我们在创建项目时遇到的问题有为降低空间复杂度,因而采用邻接表存储结构。Dijkstra的时间复杂度是O(n2)。</span>
|
|
|
|
|