首页 > 编程语言 >工程师应该学点算法——图论2

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

时间:2023-01-03 15:08:29浏览次数:58  
标签:小美 图论 遍历 标记 CA 工程师 优先 算法 节点


为什么QQ要给女朋友推送前女友?这还是从图的算法说起。前篇 -> ​​图论1​

图的遍历

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

深度优先遍历(DFS)

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

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

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

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

工程师应该学点算法——图论2_深度优先_02

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

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

工程师应该学点算法——图论2_深度优先遍历_03

遍历路径

已经遍历进行标记的点

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开始遍历。

工程师应该学点算法——图论2_数组_04

如下表所示,我先将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深度度优先解决: 现在要求你以最快的速度去解救小美,你能计算出最快需要几步么?以及求出其最快的路径。

工程师应该学点算法——图论2_深度优先遍历_05

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

答案见文末【阅读全文】

图的应用

  1. 社交网络:QQ推荐好友功能
  2. 知识图谱:推荐算法,数据挖掘
  3. 图数据库:Neo4j
  4. 路径问题:导航软件


工程师应该学点算法——图论2_深度优先遍历_06


标签:小美,图论,遍历,标记,CA,工程师,优先,算法,节点
From: https://blog.51cto.com/u_12392289/5985747

相关文章

  • 算法刷题 Day 6 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之
    哈希表理论基础建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set和map。什么时候想到用哈希法,当我们遇到了要快速判断一个元素是......
  • 算法基础之全排列(递归)
    全排列(递归)全排列就是从第一个数字起每个数字分别与他后面的数进行交换。去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。全排列(不去重)//搜索/......
  • 【Leetcode】天堂硅谷·数字经济算法编程大赛(虚拟)
    感受题目清单​​​https://leetcode.cn/contest/hhrc2022/​​周末比较忙,两场比赛都没有参加,打的虚拟赛。题解A.化学反应实验室内有一些化学反应物,其中的任意两种反应物......
  • 牛客寒假算法基础集训营4-J-Applese 的减肥计划
    链接:​​https://ac.nowcoder.com/acm/contest/330/J​​牛客网 已知Applese两只手分别产生的力的大小,以及它们之间的夹角,试求两力合力的大小。输入描述:仅一行三个整......
  • 牛客寒假算法基础集训营4-B-Applese 走方格
    链接:​​https://ac.nowcoder.com/acm/contest/330/B​​​牛客网 在这个游戏中,它位于一个n行m列的方阵中的左上角(坐标为(0,0),行的序号为0∼n−10∼n−1,列的序号为0......
  • 递归算法
    一、递归实现N!.代码实现:packagecn.test;/***@author徐庶*@date2016年9月6日*/publicclassRecursive{//递归privatestaticlongfactorial(intn){if(n......
  • LRU、LFU、FIFO算法总结
    一、概述(1)FIFO:FirstInFirstOut,先进先出(2)LRU:LeastRecentlyUsed,最近最少使用(3)LFU:LeastFrequentlyUsed,最不经常使用  FIFO表示先进先出,类似于对列,在数据的结构......
  • runoob-数据结构与算法
    https://www.runoob.com/data-structures/data-structures-tutorial.html数据结构(英语:datastructure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,......
  • 算法之摩尔投票法
    今天接触了一个很有意思的算法,用于求众数。用力扣的题做起来比较有感觉,https://leetcode.cn/problems/majority-element/。当一群人投票表决某一个事时,想找出占人数一半......
  • 代码随想录算法训练营第六天|LeetCode 242.有效的字母异位词、LeetCode 349. 两个数组
    242.有效的字母异位词文章:代码随想录(programmercarl.com)视频:https://www.bilibili.com/video/BV1YG411p7BAclassSolution{public:boolisAnagram(strings,......