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

时间:2010-12-02 04:36:22

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

在我的以下代码中,我通过breadth first search遍历图表。代码在遍历时构造图形。这是一个非常大的图形,其中的扇形为12个。因此,每当breadth first search的深度增加时,我想要破坏它上面的层以试图最小化内存使用。我怎样才能设计算法呢?

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;
    }
}

2 个答案:

答案 0 :(得分:3)

通过持续扇出并假设树状图,BFS访问的节点数与边缘上的节点数几乎相同。 (例如,在具有扇出K的树中,每个级别n具有K ^ n个节点,并且深度小于n的节点的数量也是Theta(K ^ n))。

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

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

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

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

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

答案 1 :(得分:1)

广度优先搜索has exponential space complexity。任何技巧都只会对大图的内存需求产生边际影响。如果你想要易于处理的空间复杂性,最好使用深度优先搜索。