工程师应该学点算法——图论2

简介: 工程师应该学点算法——图论2

图的遍历

在图的遍历中我们一定要掌握两种最基础的算法:深度优先 和 广度优先。


深度优先遍历(DFS)


这种遍历算法可以想象成在玩迷宫,我们选择一个方向走到底,直至不能走了然后再返回一步继续尝试其他的方向,在代码中就是递归+回溯,这就是 深度优先遍历。


走过的点要做标记,标记过的不会再重复尝试,比如 0 -> 1,1 -> 0,否则已经走过的点 0 和 1 就会重复经过,陷入死循环。


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRktJUDlnVlREbjlpYjVrVThiQ0FjQXNIQVFIM25IcjRLb1h5SE5BSjlySXpYUjA4bFJZbHpEdFpiWEVtT0liMUR0RHIwV0VENU9OdVEvNjQw.png


如上图,从任何一个顶点开始,这里从 0 ,随机一个方向走下一步,将遍历过的点标记,以后不再走,直到走到尽头,再回退(回溯)一个点,这样我们就可以实现深度优先的遍历。


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2dpZi9rdkJvYTd0NFBSRktJUDlnVlREbjlpYjVrVThiQ0FjQXNuaktmdzlaMDFmSzY1VjlvdGlhTE9ZRnRQR0JmM0ZoaHRST0pvdDA4cEFpY1pRaEp4TmJHelJwdy82NDA.png


如上图有两个数组,左边用一个数组记录了遍历的路径,索引是节点,值是父节点位置,右边的数组记录了是否已经标记过,T 代表是,f 代表否。

没看懂?没关系,我一步一步的写出来, 举例如下:


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeVNpYmljZDljeGdra29UcmxacmppYmhWUk80UFZKT3pSNGpycFdvTzdHYjNpYklJRmljcVdTZEcxSXl3LzY0MA.png

遍历路径 已经遍历进行标记的点
A A
A -> B A,B
A -> B -> E A,B,E
A -> B -> E -> D A,B,E,D
A -> B -> E -> D -> C A,B,E,D,C
A -> B -> E -> D(回溯,因为C子节点都被标记了) A,B,E,D,C
A -> B -> E (回溯,跟D有关的点都被标记) A,B,E,D,C
A -> B (回溯,跟E有关的点都被标记) A,B,E,D,C
A -> B -> F (C被标记,不用走) A,B,E,D,C,F
A -> B -> F -> G A,B,E,D,C,F,G
..... .......


广度优先遍历(BFS)


广度优先遍历同深度优先不同,他的主旨是先遍历同级,再遍历下级。类似于树的层遍历。


方法是每遍历一个点,优先把他的所有子节点加入到队尾,再从队头取出一个点出来,这样可以保证优先遍历同层, 直至队列为空


走过的点依然要标记,防止死循环。


如下图,从0开始遍历。


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2dpZi9rdkJvYTd0NFBSRktJUDlnVlREbjlpYjVrVThiQ0FjQXN6NzN5bDVNbGliWTU1TXl0ZmU1SDJqa1NmbkFIUzBiaWNPVG03RFhMVFNNaWNlZklFWEZnWENaTXcvNjQw.png

如下表所示,我先将1入队列



队列

入队列节点

出队列节点

已经标记的节点

[o]

1,2,3

0

0,1,2,3

[1,2,3]

没有(这里没有入队列,因为2,3是已经标记的节点)

1


0,1,2,3

[2,3,5,6]

5 6(0,1已经被标记,不会入队列)

2

0,1,2,3,5,6

...

...

...

...


说那么多不如来做做题!

解救美女


有一天,小美和你去玩迷宫,但是方向感不好的小美很快就迷路了,你得知之后便去营救,你已经弄清楚了迷宫的地图


1. BFS广度优先解决: 现在你要知道你从当前位置出发是否能够到达小美的位置。


2. DFS深度度优先解决: 现在要求你以最快的速度去解救小美,你能计算出最快需要几步么?以及求出其最快的路径。

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeVlNNXhmY2ljb29FQ3hqZjhCaFRhRE5Fb2Z1T1N5eE0wZm5VUjlHV0owb3RpYjJ2WFlySjhrVkhRLzY0MA.png


  • 1表示地图上的障碍物,0表示有路可以走
  • 邻接矩阵(二维数组):
0(你) 0 1 00 0 0 00 0 1 00 1 0(小美) 00 0 0 1


答案见文末【阅读全文】

图的应用

  1. 社交网络:QQ推荐好友功能
  2. 知识图谱:推荐算法,数据挖掘
  3. 图数据库:Neo4j
  4. 路径问题:导航软件
相关文章
|
7月前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
7月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1575统计所有可行路径
【动态规划】【图论】【C++算法】1575统计所有可行路径
|
7月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
|
5月前
|
机器学习/深度学习 人工智能 算法
「AI工程师」算法研发与优化-工作指导
**工作指导书摘要:** 设计与优化算法,提升性能效率;负责模型训练及测试,确保准确稳定;跟踪业界最新技术并应用;提供内部技术支持,解决使用问题。要求扎实的数学和机器学习基础,熟悉深度学习框架,具备良好编程及数据分析能力,注重团队协作。遵循代码、文档和测试规范,持续学习创新,优化算法以支持业务发展。
272 0
「AI工程师」算法研发与优化-工作指导
|
1月前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
|
4月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
81 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
5月前
|
存储 算法 C语言
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
软考中级之数据库系统工程师笔记总结(二)数据结构与算法
42 0
|
7月前
|
算法 Python
Python中实现图论算法
Python中实现图论算法 “【5月更文挑战第20天】”
49 3
|
6月前
|
算法 数据挖掘 定位技术
算法必备数学基础:图论方法由浅入深实践与应用
算法必备数学基础:图论方法由浅入深实践与应用
|
7月前
|
人工智能 算法 BI
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接
【图论】【 割边】【C++算法】1192. 查找集群内的关键连接