c++ - 为什么BFS对于同一个图中不同的节点位置给出不同的运行时间?

标签 c++ algorithm graph-algorithm breadth-first-search

我有一个折线图,由 100 个节点组成,标记为从 0 到 99。

看起来像这样:

0--1--2--3....98--99

在第一种情况下,我使用 BFS、DFS、Dijkstra 算法找到从节点 0 到所有其他节点的最短路径,在第二种情况下,我对节点 55(起始节点)和第三种情况下的节点 99 执行相同的操作.

但是在 BFS 中,最后一种情况所花费的时间是第一种情况所花费时间的两倍,但是两种情况下节点位置在图形上是相同的。我已将运行时间附在image中.

BFS中的for和while循环被访问的次数相同,我想知道,为什么这三种情况花费的时间不同?

顺便说一下,它是用C++实现的,并且使用 vector 的 vector 来存储图。

提前非常感谢您。

最佳答案

首先:您是否运行过多次?结果可能会有很大差异。

无论如何,这很可能是由于缓存问题造成的。当您从 0 开始访问数组时,计算机通常工作得很好,因为它们会立即缓存您正在访问的索引中的数组(一部分)。但如果从数组末尾开始,则不会将整个数组放入快速缓存中。 (这对于 vector 来说没有什么不同,因为 vector 只是一个动态调整大小的数组)

此外,你不应该以这种方式测试算法速度,你不能像这样真正比较它们。因为如果您第一次运行 BFS,它根本还没有缓存整个数组。但是当您运行 DFS 时,整个阵列可能位于处理器的快速缓存中。我建议采用更大的图表并检查稀疏图和密集图。另外,我会确保为每个算法编写单独的程序,以使用诸如 time 之类的实用程序进行检查。

关于c++ - 为什么BFS对于同一个图中不同的节点位置给出不同的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968231/

相关文章:

java - Java中的最短路径实现

c++ - 按索引分区数组

algorithm - 递归查询邻接表以在 SQL 中预先排序树遍历?

r - 从聚合满足条件的列表中查找 n 个元组

graph - 为什么广度优先搜索中除了黑色和白色以外,还需要给一个节点涂上灰色呢?

algorithm - 在 map 上找到 n 个点,将 k 个点等分。

c++ - 从 std::istream 读取 LLVM IR

c++ - 映射、迭代器和复杂结构 - STL 错误

c++ - 从 blitz 数组中获取存储类型

python - 字符串的递归 - 回到字符串的开头?