算法学习笔记_广度优先搜索

本文深入探讨了图论的基本概念,包括有向图、无向图、树等,并详细解析了广度优先搜索算法。介绍了如何利用广度优先搜索解决最短路径问题,避免死循环,以及其在人际关系图中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习编程知识的同时,梳理知识,也便于以后查找
tags: 图解算法、B站视频

图由结点组成。
与结点直接相连的结点称为邻居。不直接相连的不是。

  • 有向图
    结点之间箭头了解的图。其中关系是单向的。
    A->B, A有邻居,B没有。
  • 无向图
    没有箭头,直接相连的节点互为邻居。

实现图

图由多个结点组成。每个结点都与临近结点相连。
可以使用散列表表示这种关系。

graph = {}
graph["you"] = ["a","b","c"]

拓扑学排序

注: 拓(tuò)

示例

在这里插入图片描述

从某种程度上,这种列表是有序的。
如果A依赖于B,在列表中A就必须在B后面。这被称为拓扑学。使用它可根据图创建一个有序列表。

最短路径问题

找出图中最短路径。解决最短路径问题的算法被称为广度优先算法。

树是一种特殊的图。其中没有往后指的边。

广度优先算法

是一种用于图的查找算法。

广度优先搜索可回答两类问题

  • 一、从结点A出发,有前往结点B的路径吗?
  • 二、从结点A出发,前往结点B的那条路径最短?

示例
将人际关系视为图,你的朋友是一度关系、朋友的朋友是二度关系。

执行过程

广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,既先检查一度关系,再检查二度关系。

广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。

注: 只有按添加顺序查找时,才能实现这样的目的。实现这种目的的数据结构可以用队列

避免死循环

检查一个结点之后,应将其标记为已检查,且不再检查他。

如果A是B和C的朋友,就会被检查两次。如果A是B的朋友,B是A的朋友,就会造成死循环。

可以用一个列表来记录检查过的人。

def search(name):
    search_queue = deque()
    search_queue += graph[name]
    # 记录检查过的
    searched = []

    while search_queue:
        person = search_queue.popleft()
        if not person in searched:
            if person_is_seller(person):
                print(person+" is a mango seller!")
                return True
            else:
                search_queue += graph[person]
                # 将检查过的,添加到列表中
                searched.append(person)
    return False


# 实现图
graph = {}
graph["you"] = ["a","b","c"]

search("you")
运行时间

将沿着每条边前进(边是从一个结点到另一个结点的箭头或连接),因此运行时间至少为O(边数)。

还使用了一个队列,其中包含要检查的每个结点。添加每个结点时间都是O(1),因此对每个节点这样操作需要的总时间为O(结点数)

广度优先搜索的运行时间为O(结点数+边数),通常写作O(V+E),V为顶点数,E为边数。

–END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值