为什么BFS的复杂度是O(V+E)而不是O(E)? [复制]

2023-12-05

这是一个通用的 BFS 实现:

enter image description here For a connected graph with V nodes and E total number of edges, we know that every edge will be considered twice in the inner loop. So if the total number of iterations in the inner loop of BFS is going to be 2 * number of edges E, isn't the runtime going to be O(E) instead?


在这种情况下,人们需要更深入地了解实施情况。特别是,如何确定节点是否被访问?

传统算法通过对顶点着色来实现这一点。所有顶点一开始都是白色的,当它们被访问时,它们就会变成黑色。因此,只需查看顶点的颜色即可确定访问情况。如果您使用这种方法,那么您必须执行 O(V) 的初始化工作,在开始时将每个顶点的颜色设置为白色。

您可以以不同的方式管理颜色。您可以维护一个包含所有访问过的节点的数据结构。如果这样做,您可以避免 O(V) 初始化成本。但是,您将在数据结构的其他地方支付该成本。例如,如果将它们全部存储在平衡树中,则每个if w is not visited现在成本为 O(log V)。

这显然给了你一个选择。您可以使用传统的着色方法获得 O(V+E),也可以通过将此信息存储在您自己的数据结构中来获得 O(E log V)。

您在问题中指定一个连通图。在这种情况下,O(V+E) == O(E),因为顶点数永远不会超过 E+1。然而,BFS 的时间复杂度通常是针对任意图给出的,其中可以包括非常稀疏的图。

如果图足够稀疏(例如,一百万个顶点和五个边),则初始化的成本可能足够大,以至于您想要切换到 O(E ln V) 算法。然而,这些在实际环境中非常罕见。在实际设置中,与更奇特的数据结构相比,传统方法(为每个顶点赋予颜色)的速度快得令人眼花缭乱,以至于您可以为除最稀疏的图形之外的所有内容选择这种传统的着色方案。

如果您在顶点上维护了专用的颜色属性,并且具有不变规则,即在算法调用之间所有节点都是黑色,则可以通过对每个 BFS 执行两次来将成本降低到 O(E)。在第一次通过时,您可以将它们全部设置为白色,然后进行第二次通过将它们全部设置为黑色。如果你有一个非常稀疏的图,这可能会更有效。

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

为什么BFS的复杂度是O(V+E)而不是O(E)? [复制] 的相关文章

  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • JavaScript 数组扩展语法的时间复杂度是多少?

    我想知道在 JavaScript 中使用数组扩展的时间复杂度是多少 是线性 O n 还是常数 O 1 下面的语法示例 let lar Math max nums 传播称为 Symbol iterator 有关对象的属性 对于数组 这将迭代数
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 从 1 到 20 亿,像 (23,29) 这样相差 6 的连续素数对的数量

    如何在考虑时间复杂度的情况下从 1 到 20 亿 使用任何编程语言且不使用任何外部库 找到像 23 29 这样相差 6 的连续素数对的数量 尝试过埃拉托色尼筛 但获得连续素数是一个挑战 使用了生成器 但时间复杂度非常高 代码是 def ge
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用

随机推荐

  • 在 OpenCV 中复制像素值

    我有 RGB 图像 例如尺寸为 2x2 如下 0 14 255 75 156 255 45 255 234 236 141 255 我想将每个像素 所有 RGB 通道 复制 2x2 次并获得如下所示的图像 0 14 255 0 14 255
  • 什么是 Irvine32 库以及我们为什么使用它?

    我想知道Irvine32汇编语言库是什么 我想要一个定义以及我们为什么使用这个库 我想知道汇编语言中的 Irvine32 库是什么 Irvine32 库是有用函数的集合 您可以查看在线文档了解它们的列表和更多详细信息 我想要一个防御以及为什
  • Google 日历 API - 插入活动 - 通过电子邮件通知组织者

    使用 Google 日历 API 事件 插入 我代表用户在用户的日历中创建一个事件并将他们设置为组织者 我还邀请了一位客人 我希望组织者收到类似于来宾可能收到的电子邮件通知 我尝试使用 sendUpdates 参数 但它只通知客人 有没有办
  • 我们如何使用这些指令在汇编中使用跳转?

    据我所知 组装中的跳跃基本上是从一个位置到另一个位置 说我们有 804828f 74 05 je XXXXXXX 8048291 e8 1e 00 00 00 call 80482b4 根据这本书 我真正要做的就是将 0x05 添加到 80
  • Visual Studios 在构建项目时反复出现 PDB API 调用失败

    所以我有一个项目位于另一个目录中 我将其复制并移动到另一个目录中 以便将其转储到之前运行早期版本代码的本地 git 存储库中 我知道为什么我要很好地复制这些内容 这是一个很长的故事并且无关紧要 在尝试在 Visual Studios 201
  • 奇怪的错误,链接在 jquery 'tabs+accordion' 中不起作用[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我是新来的 到处寻找答案但找不到 我正在使用 Codecanyon 的这个很棒的选项卡
  • 用法相当不同

    我想在我的小型 Web 项目中使用这个出色的 Javascript 库 http prettydiff com 我已经下载了 PrettyDiff js 和 ViewDiff js 我一直在研究如何使用它 但似乎找不到任何有关如何获取 Ja
  • Composer 需要本地包

    我有几个正在协同开发的库 Foo 和 Bar 但在技术上仍然是独立的 以前我刚刚重新定义了自动加载器 Foo Foo src 但现在我已经向 Foo 添加了 Guzzle 依赖项 Bar 翻转了它的盖子 因为它不是它的依赖项之一 目录结构
  • Python中递归子集和

    我很乐意得到一些帮助 我有以下问题 我得到了一个数字列表seq和一个目标数字 我需要写两件事 返回的递归解决方案True如果存在等于目标数的子序列之和并且False否则 例子 subset sum 1 1 5 4 0 True subset
  • 正则表达式匹配不带连续空格的用户名

    我正在努力制作一个 javascript 正则表达式来满足以下要求 第一个字符必须是字母 a zA Z 其余的可以是任何字母 任何数字 连字符 点 下划线和空格 但没有连续的空格 例如 连续两个或多个空格 长度必须在 3 到 25 之间 含
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • 如何正确锁定 Task.Run() 块

    我正在编写一个应用程序 其中使用多种方法来访问某些共享资源 因此通过以下方式实现了一些安全性lock thisLock 一切都很好 直到我不得不在异步任务中使用资源 这是代码 private object thisLock new obje
  • 如何使用 Razor 语法在 ASP.NET MVC 4 中获取文本中 URL 的链接?

    我有一个带有文本字段的模型 文本can包含多个 URL 它不必包含 URL 也没有特定的格式 Using Html DisplayFor model gt model TextWithSomeUrls 当然 文本和 URL 的显示方式与普通
  • 使用 python2 和 python3 的相同代码进行编码+加密+填充时出现问题[重复]

    这个问题在这里已经有答案了 免责声明 我了解以下内容not适合在生产环境中提供 安全 它只是比对存储在我的系统上的敏感数据使用 XOR 或 rot13 更好一点 我将以下代码放在一起 以允许我对这些敏感值使用 AES 加密 AES 需要 1
  • 无法在真实设备上使用 Appium 识别 iOS hyprid 应用程序自动化中 WEBVIEW 中的元素

    我试图使用 ionic2 Angular2 和 typescript 来自动化混合应用程序构建 我正在使用 C 来编写代码 测试在 BDD specflow 中 版本 iOS 9 3 1 代码 7 3 阿皮姆 1 4 13 将上下文切换到
  • TypeScript 实用程序类型优于可区分的联合类型

    给定一个像这样的受歧视联合类型 type HomeRoute name Home type PageRoute name Page id number type SearchRoute name Search text string lim
  • 如果您可以解码 JWT,它们的安全性如何?

    如果我得到一个JWT我可以解码有效负载 这如何安全 难道我不能从标头中获取令牌 解码并更改有效负载中的用户信息 然后使用相同的正确编码秘密将其发送回来吗 我知道它们必须是安全的 但我真的很想了解这些技术 我缺少什么 JWT 可以进行签名 加
  • 从 VBA 运行 Telnet 会话

    我有一个可以执行 FTP 功能的 VBA 库 我也想执行 telnet 操作 目前 我正在编写一个 Perl 脚本 该脚本基于文本文件执行 telnet 但我想从 VBA 内部本地驱动 telnet 连接 有人有这方面的资料吗 我不想使用加
  • 如何使用依赖属性来替换UserControl构造函数中的参数?

    我注意到以前有人问过类似的问题 但我没有找到任何详细的例子 我有一个winform程序 它的构造函数有一个参数cn public AddFailure ProSimConnect cn constructor in winform this
  • 为什么BFS的复杂度是O(V+E)而不是O(E)? [复制]

    这个问题在这里已经有答案了 这是一个通用的 BFS 实现 For a connected graph with V nodes and E total number of edges we know that every edge will