# Weighted graph general concepts
# 加权图一般概念
Every weighted graph should contain:
1. Vertices/Nodes (I will use "vertex" in this readme).
每个加权图应包含:
1. 顶点/节点(我将在本自述文件中使用“顶点”)。
<img src="Images/Vertices.png" height="250" />
2. Edges connecting vertices. Let's add some edges to our graph. For simplicity let's create directed graph for now. Directed means that edge has a direction, i.e. vertex, where it starts and vertex, where it ends. But remember a VERY IMPORTANT thing:
* All undirected graphs can be viewed as a directed graph.
* A directed graph is undirected if and only if every edge is paired with an edge going in the opposite direction.
2. 连接顶点的边缘。 让我们在图中添加一些边。 为简单起见,我们现在创建有向图。 定向意味着边缘有一个方向,即顶点,它开始的位置和顶点,它的终点。 但请记住一件非常重要的事情:
* 所有无向图可以被视为有向图。
* 当且仅当每个边缘与沿相反方向的边缘配对时,有向图是无向的。
<img src="Images/DirectedGraph.png" height="250" />
3. Weights for every edge.
3. 每个边的权重。
<img src="Images/WeightedDirectedGraph.png" height="250" />
Final result.
Directed weighted graph:
最后结果。
定向加权图:
<img src="Images/WeightedDirectedGraphFinal.png" height="250" />
Undirected weighted graph:
<img src="Images/WeightedUndirectedGraph.png" height="250" />
And once again: An undirected graph it is a directed graph with every edge paired with an edge going in the opposite direction. This statement is clear on the image above.
Great! Now we are familiar with general concepts about graphs.
再一次:一个无向图,它是一个有向图,每条边与一条边相反。 这个陈述在上面的图片中很清楚。
大! 现在我们熟悉关于图的一般概念。
# The Dijkstra's algorithm
This [algorithm](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) was invented in 1956 by Edsger W. Dijkstra.
这个[算法](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)由Edsger W. Dijkstra于1956年发明。
It can be used when you have one source vertex and want to find the shortest paths to ALL other vertices in the graph.
The best example is a road network. If you want to find the shortest path from your house to your job or if you want to find the closest store to your house then it is time for the Dijkstra's algorithm.
当您有一个源顶点并且想要找到图中所有其他顶点的最短路径时,可以使用它。
最好的例子是道路网络。 如果你想找到从你家到你工作的最短路径,或者如果你想找到离你家最近的商店,那么现在是Dijkstra算法的时候了。
The algorithm repeats following cycle until all vertices are marked as visited.
Cycle:
1. From the non-visited vertices the algorithm picks a vertex with the shortest path length from the start (if there are more than one vertex with the same shortest path value then algorithm picks any of them)
2. The algorithm marks picked vertex as visited.
3. The algorithm checks all of its neighbours. If the current vertex path length from the start plus an edge weight to a neighbour less than the neighbour current path length from the start than it assigns new path length from the start to the neighbour.
When all vertices are marked as visited, the algorithm's job is done. Now, you can see the shortest path from the start for every vertex by pressing the one you are interested in.
算法重复以下循环,直到所有顶点都标记为已访问。
周期:
1. 从非访问顶点,算法从开始选择具有最短路径长度的顶点(如果有多个具有相同最短路径值的顶点,则算法选择其中任何一个)
2. 该算法将拾取的顶点标记为已访问。
3. 算法检查所有邻居。 如果从开始加上边缘权重到邻居的当前顶点路径长度小于从开始起的邻居当前路径长度,则从开始到邻居分配新的路径长度。
当所有顶点都标记为已访问时,算法的作业就完成了。 现在,您可以按下您感兴趣的那个,从每个顶点开始看到从最开始的最短路径。
I have created **VisualizedDijkstra.playground** game/tutorial to improve your understanding of the algorithm's flow. Besides, below is step by step algorithm's description.
A short sidenote. The Swift Algorithm Club also contains the A* algorithm, which essentially is a faster version of Dijkstra's algorithm for which the only extra prerequisite is you have to know where the destination is located.
我创建了 **VisualizedDijkstra.playground** 游戏/教程,以提高您对算法流程的理解。 此外,下面是逐步算法的描述。
一个简短的旁注。 Swift算法俱乐部还包含 `A*`算法,它本质上是Dijkstra算法的更快版本,唯一的额外先决条件是您必须知道目的地的位置。
## Example
## 例子
Let's imagine that you want to go to the shop. Your house is A vertex and there are 4 possible stores around your house. How to find the closest one/ones? Luckily, you have a graph that connects your house with all these stores. So, you know what to do :)
让我们想象你想去商店。 你的房子是一个顶点,你家周围有4个可能的商店。 如何找到最近的一个/一个? 幸运的是,你有一个图表,连接你的房子和所有这些商店。 所以,你知道怎么做:)
### Initialisation
### 初始化
When the algorithm starts to work initial graph looks like this:
当算法开始工作时,初始图形如下所示:
<img src="Images/image1.png" height="250" />
The table below represents graph state:
下表表示图形状态:
| | A | B | C | D | E |
|:------------------------- |:---:|:---:|:---:|:---:|:---:|
| Visited | F | F | F | F | F |
| Path Length From Start | inf | inf | inf | inf | inf |
| Path Vertices From Start | [ ] | [ ] | [ ] | [ ] | [ ] |
>inf is equal infinity which basically means that algorithm doesn't know how far away is this vertex from start one.
>F states for False
>T states for True
> inf等于无穷大,这基本上意味着算法不知道这个顶点距离起点有多远。
> F表示False
> T表示True
To initialize our graph we have to set source vertex path length from source vertex to 0 and append itself to path vertices from start.
要初始化我们的图形,我们必须将源顶点路径长度从源顶点设置为0,并将自身附加到从start开始的路径顶点。
| | A | B | C | D | E |
|:------------------------- |:---:|:---:|:---:|:---:|:---:|
| Visited | F | F | F | F | F |
| Path Length From Start | 0 | inf | inf | inf | inf |
| Path Vertices From Start | [A] | [ ] | [ ] | [ ] | [ ] |
Great, now our graph is initialised and we can pass it to the Dijkstra's algorithm, let's start!
Let's follow the algorithm's cycle and pick the first vertex which neighbours we want to check.
All our vertices are not visited but there is only one has the smallest path length from start. It is A. This vertex is the first one which neighbors we will check.
First of all, set this vertex as visited.
太好了,现在我们的图表被初始化了,我们可以将它传递给Dijkstra的算法,让我们开始吧!
让我们按照算法的循环,选择我们要检查的邻居的第一个顶点。
我们没有访问所有顶点,但只有一个顶点从开始开始具有最小的路径长度。 它是A.这个顶点是我们将检查的邻居的第一个顶点。
首先,将此顶点设置为已访问。
A.visited = true
<img src="Images/image2.png" height="250" />
After this step graph has this state:
在此步骤图之后具有以下状态:
|
swift-algorithm-club的翻译。使用Swift学习算法和数据结构。.zip
需积分: 0 43 浏览量
更新于2024-01-01
收藏 8.05MB ZIP 举报
在Swift编程语言中,了解和掌握数据结构与算法是提升编程技能的关键步骤。"swift-algorithm-club"是一个致力于帮助开发者使用Swift学习算法和数据结构的项目。它提供了丰富的实例和解释,使得开发者能够深入理解这些核心概念,并将它们应用到实际的软件开发中。
数据结构是计算机科学的基础,它涉及如何在内存中有效地组织和存储数据,以便于快速访问和处理。主要的数据结构类型包括数组、链表、栈、队列、树、图、哈希表等。每种数据结构都有其特定的用途和操作特性。
1. **数组**:是最基本的数据结构,它是一系列相同类型的元素集合,通过索引进行访问。在Swift中,可以使用Array类型来创建和操作数组。
2. **链表**:不同于数组,链表的元素在内存中不是连续存放的,每个元素(节点)包含数据和指向下一个节点的指针。链表分为单向链表和双向链表,前者只能按一个方向遍历,后者则可以双向遍历。
3. **栈**:遵循“后进先出”(LIFO)原则,用于临时存储和检索数据。Swift中的Array可以模拟栈的操作,如push(入栈)和pop(出栈)。
4. **队列**:遵循“先进先出”(FIFO)原则,类似于现实生活中的排队。Swift中可以使用Array或CollectionType来实现队列。
5. **树**:是一种非线性的数据结构,由节点和边构成,每个节点可能有零个或多个子节点。二叉树是最常见的树类型,每个节点最多有两个子节点。Swift中可以自定义结构体来表示树。
6. **图**:由节点(顶点)和连接它们的边组成,可以用来表示复杂的关系。图可以是无向的(任意两个节点间可以双向连接)或有向的(边有方向性)。Swift中通常用字典来表示图。
7. **哈希表**:也称为散列表,通过哈希函数将键映射到数组的特定位置,提供快速查找。Swift的标准库提供了Dictionary类型,实现了哈希表。
在"swift-algorithm-club"项目中,你可能会学习到如何使用Swift实现这些数据结构,以及如何对它们进行操作,比如插入、删除、搜索等。此外,项目可能还会涵盖排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找算法(如二分查找、广度优先搜索、深度优先搜索)和其他算法,如动态规划、贪心算法、回溯法等。
通过深入学习这些数据结构和算法,你可以提升解决问题的能力,编写出更高效、更优化的代码。对于软件工程师来说,这是一项不可或缺的技能,无论是面试还是日常开发,都能发挥巨大作用。在Swift中实践这些概念,还能更好地理解和利用Swift的特性和语法。因此,"swift-algorithm-club"是一个绝佳的学习资源,值得每一个Swift开发者探索。
zero2100
- 粉丝: 172
- 资源: 2460
最新资源
- 学习性的ENVI IDL上机实验,包括IDL基本语法、OMI产品读取、MODIS04-GRID最近邻站点提取、MODIS-SWATH重投影、插值算法、FY4A定标提取、ERA5再分析资料等相关遥感数据
- Python毕业设计-基于知识图谱的电影推荐系统源码(完整项目源码).zip
- 商品复购预测实战数据!!
- 空间直角坐标与大地坐标互转程序VB.Net
- 三菱伺服调试软件MR Configurator2 Ver 1.145B 安装包最新版 2024
- Innosetup5增强版
- 废料垃圾数据集,PASICAL VOC XML标注,9562张图片,可识别瓶子,纸板,金属,其他的,纸,宠物,塑料,聚丙烯,塑料,皮带
- 废料垃圾数据集,coco json标注,9562张图片,可识别瓶子,纸板,金属,其他的,纸,宠物,塑料,聚丙烯,塑料,皮带
- SSM 与 JSP 共筑青大校园预点餐系统:迈入智能校园餐饮设计时代
- FY4A-QPE产品的预处理和MMK趋势分析和Hurst指数等相关统计分析,以及制图(箱线图/折线图等)分析源代码+文档