数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?

广度优先搜索解决三度好友关系问题
时间、空间复杂度
代码实现
原理
时间、空间复杂度
代码实现
原理
课后思考
内容小结
解答开篇
深度优先搜索(DFS)
广度优先搜索(BFS)
深度和广度优先搜索

该思维导图由 AI 生成,仅供参考

上一节我们讲了图的表示方法,讲到如何用有向图、无向图来表示一个社交网络。在社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。
一个用户的一度连接用户很好理解,就是他的好友,二度连接用户就是他好友的好友,三度连接用户就是他好友的好友的好友。在社交网络中,我们往往通过用户之间的连接关系,来实现推荐“可能认识的人”这么一个功能。今天的开篇问题就是,给你一个用户,如何找出这个用户的所有三度(其中包含一度、二度和三度)好友关系?
这就要用到今天要讲的深度优先和广度优先搜索算法。

什么是“搜索”算法?

我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。
图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。
我们上一节讲过,图有两种主要存储方法,邻接表和邻接矩阵。今天我会用邻接表来存储图。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了深度优先搜索和广度优先搜索算法在社交网络中寻找三度好友关系的应用。首先解释了搜索算法在图数据结构上的应用,以及图的存储方法。详细介绍了广度优先搜索算法的原理和代码实现,包括时间、空间复杂度的分析。广度优先搜索算法通过“地毯式”层层推进的搜索策略,能够找出最短路径。文章总结了广度优先搜索的时间复杂度为O(V+E),空间复杂度为O(V)。接着介绍了深度优先搜索算法的原理和代码实现,以及其时间、空间复杂度。然后讨论了如何在社交网络中利用广度优先搜索算法找出三度好友关系。总结指出,广度优先搜索和深度优先搜索是图上最基本的搜索算法,适用于状态空间不大的搜索。广度优先搜索需要借助队列来实现,而深度优先搜索则适合用递归实现。最后,提出了课后思考问题,鼓励读者思考如何用深度优先搜索解决问题,以及如何将迷宫抽象成图并在计算机中存储。整体而言,本文通过简洁清晰的语言,帮助读者快速了解了深度优先搜索和广度优先搜索算法在社交网络中的应用,以及它们的原理和实现方式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(187)

  • 最新
  • 精选
  • Jerry银银
    朗读者原谅我的有强迫症:queue这个单词读错了,付上正确的音标如下[kju] 我觉得避免这种问题,有个方法就是,朗读之前,逐个查询一下单词的正确发音,一篇文章中的单词屈指可数,这个工作量按理说应该不大。 但是这个简单的举措,能大大提高听文章的体验,不然听起来总觉得很怪 往大了说影响,毕竟咱们极客时间做的是知识,做的是学问

    作者回复: 😂

    2018-12-03
    30
    264
  • 李东勇
    老师, 我觉得深度优先搜索的代码中有一个可以改进的地方, 可以在21行之后加一句: if (found == true) return; 这样, 在一个顶点的for循环之中, 如果已经找到了t, 就可以跳出这个for循环了。目前的逻辑是, 这个for循环中剩下的还会继续执行, 每次都调用一次recurDfs函数, 但recurDfs函数在第一行就return了。

    作者回复: 嗯嗯 👍

    2018-12-18
    6
    63
  • luo
    老师针对图这个数据结构的应用 我有点疑惑,从结构来看无论是临近矩阵还是临近表 其实都需要有一个唯一下标作为这个顶点,那么问题来了 在实际数据量庞大的时候,这种数据结构是不是就没法用了(临近矩阵就不说了,临近表的话也是需要一个大的数组存储每个顶点 ),或者只能拆成以hash先分id,之后映射到对应的机器上存储各自的临近表部分,但这样进行深度广度搜索就有网络io了。

    作者回复: 你说的没错,但是做工程就是trade-off,只能权衡来选择方案。如果实在存不下,可以降低些执行效率。不过,现在有很多图数据库,也可以解决你说的问题,把图直接存在硬盘中。

    2019-01-04
    18
  • Liam
    对于今天的问题,无权图,如果采用深度优先。拿到的路径不一定是最短路径吧

    作者回复: 不是最短路径的。广度优先可以取到最短路径。

    2019-02-13
    2
    14
  • -W.LI-
    弱弱的问一句,prev和visited用数组存是正好value和下标一致才行的吧?

    作者回复: 是的

    2019-10-20
    3
    7
  • possible
    广度优先用的queue(先进先出),深度优先把queue换成stack(后进先出)即可吧?也经常会用stack来替代递归

    作者回复: 是的

    2019-04-28
    7
  • JzyCc
    弱弱的问一下,宽搜代码那块,如果给的图中 1 和 3的位置互换,那么得出来的就不是最短路径了吧

    作者回复: 不,宽搜对于无权图来说,肯定能找到最短路径的。因为整体的逻辑是离起点越近的,越早被访问到。

    2019-02-09
    6
  • 他在她城断了弦
    可不可以这样理解,深度优先用递归思想,广度优先用迭代思想?

    作者回复: 不大行 因为深度优先也可以用非递归的方式实现

    2018-12-04
    2
    4
  • gesanri
    没明白文中说的广度优先遍历是起始顶点到终止顶点的最短路径是什么意思?就举的这个例子来说,按照广度优先的算法,一直到倒数第二个顶点才扫描到终止节点,总共经历了七个顶点,而肉眼上看明显有更短的路径,比如0346,只经历了四个顶点

    作者回复: 路径的意思你理解错了 你可以看下prev数组

    2018-12-08
    3
  • Smallfly
    老师把广度和深度优先搜索讲的真的是通俗易懂。我有个问题是,如果图中存在相同的节点,两种算法是不是就不能工作了?

    作者回复: 可以的。看你用什么信息去查找 以及怎么定义找到。所谓相同节点 这个说法有点笼统了 怎样才算两个节点相同呢

    2018-12-03
    2
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部