《算法图解》总结第 6 章:广度优先搜索

2023-11-17

仅用于记录学习,欢迎批评指正,大神勿喷

系列文章目录

《算法图解》总结第 1 章:二分查找、大O表示法;
《算法图解》总结第 2 章:数组和链表,选择排序;
《算法图解》总结第 3 章:while循环、递归、栈;
《算法图解》总结第 4 章:分而治之、快速排序;
《算法图解》总结第 5 章:散列表;
《算法图解》总结第 6 章:广度优先搜索;
《算法图解》总结第 7 章:狄克斯特拉算法;
《算法图解》总结第 8 章:贪婪算法
《算法图解》总结第 9 章:动态规划
《算法图解》总结第 10 章:K最近邻算法
《算法图解》总结第 11 章:十种算法简介


基础知识

一、最短路径问题

举例说明最短路径的含义:假设某人居住在旧金山,想要乘公交从双子峰前往金门大桥,换乘最少的的乘车路线就被称为最短路径。这种问题被称为最短路径问题。

二、 广度优先搜索

解决最短路径问题的算法被称为广度优先搜索。
广度优先搜索是一种用于图的查找算法,可回答两类问题:
(1)从节点A出发,是否有前往节点B的路径;
(2)如果有,寻找前往节点B的最短路径。

三、队列

队列类似于栈,不能随机访问队列中的元素,队列只支持两种操作:入队和出队,与栈【stack()】先进后出的数据结构不同的是,队列【deque()】是一种先进先出的数据结构。

四、图

图由节点和边组成,一个节点可能与众多节点直接相连,这些节点被称为邻居。图模拟一组连接,用于模拟不同的东西是如何相连的。可用散列表来实现图,键-值对的添加顺序无关紧要,因为散列表是无序的,图分为有向图和无向图,有向图分为单向图和双向图,双向图和无向图是等价的,均表示直接相连的节点互为邻居。

应用案例

案例:从“你”的朋友中找到关系最近的芒果销售商,朋友是一度关系,朋友的朋友是二度关系。
案例分析:
首先,建立“你”的人际关系:

graph = {}
graph["you"] = ["alice","bob","claire"]
graph["bob"] = ["anuj","peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["tom","jonny"]
graph["anuj"] =[]
graph["peggy"] = []
graph["tom"] = []
graph["jonny"] = []

其次,为了辨别亲疏关系,引入队列

from collections import deque
search_deque = deque()
search_deque += graph["you"]
# 只要队列不为空,提取队列第一人
while search_deque:
    person = search_deque.popleft()
# 判断这个人是不是芒果销售商
    # 如果是,打印名字加是个芒果销售商(注:要编写这个人是否是芒果销售商的函数)
    if people_is_seller(person):
        print(person + " is a mango seller")
    # 如果不是,在队列后面添加这个人的人际关系
    else:
        search_deque += graph[person]  

将某人是否是芒果销售商的函数补充完整,在此假设某人姓名的结尾是以“m”结尾,那么此人是芒果商。编码如下:

# 定义某人是否是芒果销售商函数
def people_is_seller(name):
    return name[-1] == "m"

此外,我们还观察到“peggy”既是“bob”的朋友,也是“alice”的朋友,当“bob”和“alice”均不是芒果销售商时,“peggy”将会被加入队列两次,但是我们仅需检查一次,为避免浪费,我们在检查过后将其标记为已检查,且不再检查其他,同时此措施也可避免当两人或多人之间的人际关系是环形时造成无限循环。

算法实现

完整Python代码如下:

# 引入队列
from collections import deque

# 创建散列表
graph = {}
graph["you"] = ["alice","bob","claire"]
graph["bob"] = ["anuj","peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["tom","jonny"]
graph["anuj"] =[]
graph["peggy"] = []
graph["tom"] = []
graph["jonny"] = []

# 定义某人是否是芒果销售商函数
def people_is_seller(name):
    return name[-1] == "m"

# 广度优先搜索
def search(name):
    # 创建队列
    search_deque = deque()
    # 加入队列
    search_deque += graph["you"]
    # 创建数组记录已检查过的人
    searched = []
    # 当且仅当队列不为空时,进行广度优先搜索
    while search_deque:
        # 删除队列第一人,并将此人定义为person
        person = search_deque.popleft()
        # 检查此人是否在已检查的数组中,当且仅当没检查过才开始检查
        if not person in searched:
            # 判断此人是否是芒果销售商
            # 如果是,打印名字加是个芒果销售商
            if people_is_seller(person):
                print(person + " is a mango seller !")
             # 如果不是,在队列后面添加此人的人际关系,并将此人添加到已检查的数组中    
            else:
                search_deque += graph[person]
                searched.append(person)
    # 当队列为空时,返回False
    return False       

测试:

search("you")

输出结果:

tom is a mango seller !

False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《算法图解》总结第 6 章:广度优先搜索 的相关文章

随机推荐

  • hdu 1007 Quoit Design

    Quoit Design Time Limit 10000 5000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 10498 Accept
  • MFC 菜单操作

    1 菜单是窗口框架的组成部分 如果我们要导入自定义的菜单 可以通过以下语句实现 在CMainFrame OnCreate的函数中添加如下代码段 SetMenu NULL 将原本的菜单项去除 CMenu menu 新定义一个菜单对象 menu
  • 计算机网络 --- DNS协议

    计算机网络 DNS协议 什么是DNS DNS工作原理 Overview Three Classes of DNS servers 1 Root servers 2 top level domain DNS servers 3 authori
  • Java学习(java基础)-韩顺平老师

    一 简单介绍 1 jdk jre 2 Java代码规范 a 类 方法的注释 要以javadoc的方式来写 author 楠小弟 version 1 0 public class Hello public static void main S
  • JDBC中典型的五种查询方式

    第一种查询方式 返回一个ArrayList集合 集合里面的数据类型只能为Empinfo类类型 public ArrayList
  • YOLOV5代码general.py文件解读

    YOLOV5源码的下载 git clone https github com ultralytics yolov5 git YOLOV5代码general py文件解读 import glob import logging import o
  • 深入浅出BP神经网络算法的原理

    相信每位刚接触神经网络的时候都会先碰到BP算法的问题 如何形象快速地理解BP神经网络就是我们学习的高级乐趣了 画外音 乐趣 你在跟我谈乐趣 本篇博文就是要简单粗暴地帮助各位童鞋快速入门采取BP算法的神经网络 BP神经网络是怎样的一种定义 看
  • vue项目实战(一)

    第一步 找到你想要存放项目的文件夹 输入cmd 就会弹出小黑窗 然后输入vue create 项目名 创建项目 前提安装好node js和搭建 vue 环境 打开终端 创建项目 按上下键进行选择 做一些配置 这次选择自定义 也就是最后一个
  • Java_得到GET和POST请求URL和参数列表

    一 获取URL getRequestURL 二 获取参数列表 1 getQueryString 只适用于GET 比如客户端发送http localhost testServlet a b c d e f 通过request getQuery
  • 计算机基础内容——网络基础

    网络基础 设备是如何上网的 网卡 有线 无线 内置天线 网线接口RJ45 usb转RJ45 交换机 路由器 外置天线 天线棒 光猫 宽带运营商 不同的宽带运营商之间是互通的 路由器发出的wifi信号 2 4GHz wifi 5 0GHz w
  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • Java基础:多线程join()方法

    join 让当前线程优先执行 JoinThread java public class JoinThread implements Runnable Override public void run for int i 0 i lt 100
  • iis中使用nginx实现反向代理负载均衡

    user nobody worker processes 1 error log logs error log error log logs error log notice error log logs error log info pi
  • vue+element实现树形上下拖拽,快速提升你的前端技能

    前言 随着前端技术的不断发展 越来越多的网站和应用需要使用树形控件来展示数据 而上下拖拽则是一个非常实用的交互方式 如果你正在寻找一种简单易用的树形控件实现上下拖拽的方法 那么本文将为你提供最佳解决方案 本文将介绍如何使用 vue 基于 e
  • Java中三种进制的数值常量

    package cn nxl2018 class Test 十进制常量赋值 void decimals byte b 10 short s 10 char ch 69 int i 10 long l 10l l L可加可不加 float f
  • 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝 去阿里面试 在第一面的时候被问到 Mysql的事务隔离级别 他竟然没有回答上来 一直在私信向我诉苦 我说 你只能怪年轻时候的你 那个时候不够努力导致现在的你技术水平不够 好吧 关于这个问题 看看普通人和高手的回答 普通
  • 计算机网络总结 TCP协议 一

    tcp协议是什么 介绍一下 TCP Transmission Control Protocol 传输控制协议 是互联网协议族中的一种基于连接的 可靠的 面向字节流的传输协议 TCP协议提供了全双工通信 数据分段 重传机制 流量控制 拥塞控制
  • java中synchronized关键字

    1 synchronized关键字简介 synchronized是java中的一个关键字 在中文中为同步 也被称之为 同步锁 以此来达到多线程并发访问时候的并发安全问题 可以用来修饰代码块 非静态方法 静态方法等 修饰代码块时 给当前指定的
  • 事务提交后发送MQ消息

    前言 本文主要介绍关于MQ使用过程中 通过场景分析为什么要使用事务控制 以及事务如何实现 场景分析 为什么我们在使用MQ的时候需要考虑结合事务 试想一下 我们平时使用Mq发送消息的通用场景是不是 生产者和MQ集群建立连接 并发送消息 消费者
  • 《算法图解》总结第 6 章:广度优先搜索

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快