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

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

图的遍历

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

深度优先遍历(DFS)

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

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

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

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

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

遍历路径已经遍历进行标记的点
AA
A -> BA,B
A -> B -> EA,B,E
A -> B -> E -> DA,B,E,D
A -> B -> E -> D -> CA,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 -> GA,B,E,D,C,F,G
............

广度优先遍历(BFS)

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

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

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

如下图,从0开始遍历。

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

  • 1表示地图上的障碍物,0表示有路可以走

  • 邻接矩阵(二维数组):

0(你) 0 1 00 0 0 00 0 1 00 1 0(小美) 00 0 0 1

答案见文末【阅读全文】

图的应用

  1. 社交网络:QQ推荐好友功能

  2. 知识图谱:推荐算法,数据挖掘

  3. 图数据库:Neo4j

  4. 路径问题:导航软件


推荐阅读:

为什么QQ能帮你找到失散多年的兄弟?----图论

每天三分钟玩转Git(完结)

promethus与监控系统

欢迎加入免费星球打卡学习 

点此了解并加入编程大队,编程大队,nb !!

如果你喜欢我的文章,就给公众号加个星标吧,方便阅读。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机智的程序员小熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值