图论
图形数据结构和遍历算法变得简单
计算机软件中的图形与高中的条形图略有不同。 当然,它们仍然是关系的映射,只是以不同的方式表示 。 图实际上可以帮助解决很多问题。 它们可以用于解决社交网络中的问题,例如。 查找朋友之间的关系或在GPS导航中查找从您的房屋到最近的购物中心的最佳路线。 例如,在机器人技术和AI中经常使用图形,有时用于保持允许机器人进入的所有可能状态(这样它们就不会摔坏东西或穿过墙壁移动)。 它们非常适合安排问题,例如何时安排交通流量(可以通过图形着色解决)。 清单还在继续,他们解决了许多现实世界中的问题 。
图形表示
了解图形的基本概念非常重要,即使它可能很无聊,但从长远来看,它可以使您获得十倍的回报。 所以我将从头开始。
什么是图? 好吧,上面有一点点,对吧? 哦,是的..您以某种方式将这些点连接在一起...瞧,您有一个图形!
这些要点是什么? 它们称为顶点或节点 。 我将使用节点术语来保持一致性。
这些线叫什么? 它们称为边 。
好的,很酷,因此我们得到的是图形 。.只是节点和边以某种方式连接! 也许看起来像这样:
![](https://i-blog.csdnimg.cn/blog_migrate/bd24738c4a95e7d627aa44233c78907d.png)
其他有助于定义图形的属性:
- 有向- 边缘仅指向单向,因此有向图的一个示例可能是仅包含可以向下行驶的单向街道的路线图。
- 无方向- 边缘指向两个方向,您可以上下移动。
- 加权-加权图具有沿特定边缘移动的某种成本 。 例如。 30分钟即可到达Y街。
- 未加权-与边缘无关的成本 。
- 非循环的-您将永远不会两次遇到相同的节点。
- 已连接-图中的所有节点都以某种方式连接。 如果该图是一个物理模型,则可以将其拾取,并且由于它是连接图,因此不会崩溃。
- 断开连接-该图由子图组成,或者是二部图 。
我们如何用代码表示这一点? 我的答案- 很多方式 。 它实际上取决于有关如何表示图形的问题 。 这是我的两个必去之地。
邻接矩阵
邻接矩阵用于表示有限图。 重要的是要注意,如果您的问题是处理连续空间,那么有更好的选择来表示图形。 那么,邻接矩阵是什么? 它本质上只是一个带有1和0的矩阵。 它可以是稀疏的(大多数填充为0),并且每一行和关联的列都是图的一个节点 ,它可能看起来像这样:
![](https://i-blog.csdnimg.cn/blog_migrate/451b5eab8764436dd5806054352b6175.png)
这是一个N * N或“ N by N”矩阵。 如您所见,数字0…至9在列上,然后是0…9在行上。 这涵盖了图中节点关系的