为了账号安全,请及时绑定邮箱和手机立即绑定

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

本文原创首发于公众号【编程三分钟】

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

图的遍历

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

深度优先遍历(DFS)

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

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

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

如上图有两个数组,左边用一个数组记录了遍历的路径,索引是节点,值是父节点位置,右边的数组记录了是否已经标记过,T 代表是,f 代表否。
没看懂?没关系,我一步一步的写出来, 举例如下:

广度优先遍历(BFS)

广度优先遍历同深度优先不同,他的主旨是先遍历同级,再遍历下级。类似于树的层遍历。
方法是每遍历一个点,优先把他的所有子节点加入到队尾,再从队头取出一个点出来,这样可以保证优先遍历同层, 直至队列为空
走过的点依然要标记,防止死循环。
如下图,从0开始遍历。

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

说那么多不如来做做题!

解救美女

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

  1. BFS广度优先解决: 现在你要知道你从当前位置出发是否能够到达小美的位置。
  2. DFS深度度优先解决: 现在要求你以最快的速度去解救小美,你能计算出最快需要几步么?以及求出其最快的路径。

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

图的应用

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

本文由博客一文多发平台 OpenWrite 发布!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消