c++ - 最小化广度优先搜索的内存使用

标签 c++ memory-management breadth-first-search

在下面的代码中,我通过广度优先搜索 遍历一个图。代码在遍历时构建图形。这是一个非常大的图,扇形为 12。因此,每当 广度优先搜索 的深度增加时,我想破坏它上面的层以尽量减少内存用法。我该如何设计算法来做到这一点?

string Node::bfs(Node * rootNode) {
QQueue<Cube *> q;
q.enqueue(rootNode);

while (!(q.empty())) {
    Node * currNode = q.dequeue();
    currNode->constructChildren();
    foreach (Node * child, currNode->getListOfChildren()) {
        q.enqueue(child);
    }
    if (currNode->isGoalNode()) {
        return currNode->path;
    }
}

最佳答案

在恒定扇出和假设树状图的情况下,BFS 访问过的节点数几乎与边缘节点数相同。 (例如,在扇出为 K 的树中,每层 n 有 K^n 个节点,深度小于 n 的节点数也是 Theta(K^n))。

因此,存储边缘已经占用了大量内存。因此,如果内存是一个非常大的问题,迭代加深 DFS 等“等效”技术可能会好得多。

但是如果你想销毁“访问过”的节点,那么可以通过某种方式来跟踪访问过的内容(在一般图的情况下;如果它一棵树那么就没有问题)需要设计。在这种情况下,需要有关图表的更多信息。

编辑为什么迭代加深 DFS 更好。

BFS 中的边缘(与已访问节点相邻的未访问节点)的大小为 O(K^n),n 是当前深度。 DFS 的边缘大小为 O(n)。

迭代加深 DFS 具有与 DFS 相同的边缘大小,并给出与 BFS 相同的结果,因为它“模拟”了 BFS。

关于c++ - 最小化广度优先搜索的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331717/

相关文章:

c++ - 重新定义不同类型的变量

c++ - Qt invokeMethod 和调用静态方法?

c++ - Using Declaration 和 Forward Declaration 之间的冲突

c++ - HDC内存泄漏(释放HDC/删除hdc)

Java BFS 算法 - 尝试在 JPanel 上绘制节点

algorithm - 如果广度优先搜索 (BFS) 可以更快地完成同样的事情,为什么还要使用 Dijkstra 算法?

c++ - 具有 const 参数和重载的函数

java - jBoss 4.0.2 多次部署相同的 WAR 导致 jBoss 由于 PermGem/Out-of-Memory 错误而崩溃

c++ - 帮助修复内存泄漏

Python:复杂的迭代