https://www.toutiao.com/a6690718452618887683/

2019-05-14 11:24:43

我们在日常生活中常常有这样的场景,打开地图,查询某个地方到某个地方怎么乘坐公交车?地图通过算法计算就会告诉我们从哪个站出发,乘坐哪一条线路,在哪里换乘,最终到达目的地?这些都是怎么实现的呢?今天我们来学习队列与广度优先搜索,来简单实现下这个功能。

队列

在此之前,我们讲了栈又讲了深度优先搜索,今天我们来讲一讲它的孪生兄弟,广度优先搜索。了解广度优先搜索之前,有一个我们必须掌握的数据结构,队列。

队列是一种常用的数据结构,相信大家都不陌生,我们平时各种排队的动作,例如排队看医生、排队上地铁,就是队列。队列的特点,就是先排队的人先出队,我们称之为FIFO(First in first out),也就是先进先出。通常,我们可以使用数组或者链表来实现一个队列。

队列的操作,每次都是从末尾进队,从队首出队,上述例子,我们先让数据1,数据2,数据3分别进队,然后再依次出队。相信大家之前就已经了解过队列,这里也不做重复的叙述,今天我们来了解队列在广度优先搜索算法中的应用。

广度优先搜索算法(BFS)

搜索,又称之穷举,即找出问题的所有状态。有人可能会问,穷举不就是For循环么?For循环只是穷举的一种方式,毕竟很多问题都无法使用For循环来直接解决。举个简单的例子,著名的华容道问题,就难以使用for循环表示出所有的状态。

广度优先搜索,只是搜索的一种常见的手段之一。广度优先搜索的核心思想,就是对于每个状态,都找到与它距离最近的状态,搜索到的结果会进入队列,以便后面重新进行搜索。我们常说,算法只是一种套路,那么广度优先搜索的模板是什么呢?

初始状态入队
while (队列不为空){取出队首拓展所有可达状态将有用的状态入队
}

如何理解广度优先搜索算法呢,我们讲一个简单的应用,在一个国家里,有着复杂的交通网络,在这里,不同的城市之间有一些有高铁线路,现在我们想知道,从1号城市出发,只坐高铁,可以到达哪些城市。下图为城市的高铁线路图。

如果我们运用广度优先算法,顺序会是这样的,我们从1号城市出发,会发现2,3号城市,将2号城市进队,然后将3号城市也进队,接着我们发现1号城市没有相连的城市了,我们再从队列中取出2号城市,然后发现把与2号城市相连的4,5号城市进队,然后从队列中取出3号城市,逐个扩展,最后能够遍历出整个地图。而剩下两个节点从始至终都没有入队,说明他们不可到达。

我们把搜索过程中,所有的状态以及状态的转移表示出来,称之为搜索树,上图为刚刚的高铁问题的搜索树。有了搜索树,树上的边表示搜索的顺序。广度优先搜索的搜索树会呈现出一层一层的分级,只有当前层已经搜索拓展完了,才会处理下一层,如何为什么会有这样的现象呢?结合队列的特性,可以思考思考。

现在让我们回到最开始的那个问题,如果如何查询一个站点到另外一个站点的公交线路呢?我们从起点站出发,可以拿到经过这个站点的所有公交线路,然后就可以查询出所有从这个站坐车可以到达的站点,把他们入队,再从队列中逐个取出来,继续拓展,直到找到目的站点为止。我们也注意到,我们有些地图还有一些步行换乘的,在这里我们也是简单的修改一下可到达的站点的算法而已,相信聪明的你已经知道怎么实现了。

最常拿来面试的算法与数据结构,不是递归,不是动态规划,看下这相关推荐

  1. 面试常被问到排序算法总结(插入+选择+交换+归并排序)

    排序算法总结 谈及排序算法,大家知道常见的排序算法都有哪些呢? 下面来总结一下常见的排序算法: 插入排序 基本思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记 ...

  2. Java面试常见算法

    在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序.二叉树查找等等. 本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了 ...

  3. 面试中常见的数据结构与算法

    第二章排序 2.1 O(n2) 算法 给定一数组,其大小为8个元素,数组内的数据无序. 6 3 5 7 0 4 1 2 冒泡排序:两两比较,将两者较少的升上去,第一次比较空间为0-(N-1)直到最后一 ...

  4. 如何从菜鸡变成收割机,大厂面试的算法,你懂了吗?

    是什么?让大厂面试显得逼格很高,是算法和数据结构吗? 是的!!! Google工程师曾总结过,大厂之所以爱考察算法和数据结构是因为: 算法能力能够准确辨别一个程序员的技术功底是否扎实: 算法能力是发掘 ...

  5. 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...

  6. php面试带项目_PHP面试常用算法(推荐)

    一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...

  7. 程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦

    (七月在线:https://www.julyedu.com/,面试 & 算法 & 机器学习在线课程) 作者:July--结构之法算法之道blog之博主. 时间:2010年10月-201 ...

  8. vb6 判断打印机是否有效_吊打面试官 | 算法之如何判断括号是否有效?

    今天要讲的这道题是 bilibili 今年的笔试真题,也是一道关于栈的经典面试题. 经过前面文章的学习,我想很多朋友已经看出来了,我接下来要写的是一个关于「算法图解」的系列文章,中间可能会穿插少量的其 ...

  9. 程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结

    程序员面试.算法研究.编程艺术.红黑树4大经典原创系列集锦与总结 作者:July--结构之法算法之道blog之博主. 时间:2010年10月-2011年6月. 出处:http://blog.csdn. ...

最新文章

  1. 用c语言链表编写便利店零售系统,链表实现多项式求和(C语言)
  2. java简述会话对象的生命周期_简述Java Web三大作用域对象
  3. refreshtoken用mysql_微信access_token和refresh_token保存于redis
  4. jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!)...
  5. c#中textbox属性_C#.Net中的TextBox.MaxLength属性与示例
  6. Knockoutjs官网翻译系列(一)
  7. 1.5编程基础之循环控制 32 求分数序列和 python
  8. Latex学习记录2
  9. Python知识整理_1
  10. 轻量服务器怎么换系统,轻量服务器更换系统
  11. Kotlin入门(9)函数的基本用法
  12. QueryRunner实战(query_update)、BeanList\BeanHandler、MapList\MapHandler、ScalarHandler
  13. set 存放类或结构体的打印
  14. Windows客户端使用教程
  15. python32位系统下载_python 32位安装包
  16. 百度拓展数字藏品多元发展
  17. 如何提升Javascript 基础
  18. 2020宁波银行终面一分钟抽词演讲
  19. Linux——根目录结构
  20. MATLAB学习笔记 MATLAB仿PhotoShop油画/毛玻璃/漩涡/锥形等特效

热门文章

  1. scikit-learn朴素贝叶斯各种用法总结真正讲明白的,为作者建平点赞
  2. 9.19scikit-learn安装方法
  3. ECLIPSE 添加插件3种方法
  4. 丁磊建议将少儿编程纳入学业水平考试,是少儿编程太热,还是起跑线焦虑
  5. 重磅开源人工智能纹理分割自动分割由参考纹理覆盖图像自监督学习
  6. 深度学习下的医学图像分析 2
  7. 荐书 | 10 本机器学习电子书,美版 Kindle 免费读
  8. ​数字政府发展指数排名出炉!上海、浙江、北京位列前三,你的城市排第几?(附报告全文下载)...
  9. 干货 | 手把手教你用115行代码做个数独解析器!(附代码)
  10. 深度学习中的Normalization模型(附实例公式)