如何理解分支定界中广度优先搜索的内存问题

Posted

技术标签:

【中文标题】如何理解分支定界中广度优先搜索的内存问题【英文标题】:how to understand the memory issue of breadth-first-search in branch and bound 【发布时间】:2017-02-27 09:53:12 【问题描述】:

我最近被分支定界法弄糊涂了。分支定界法有三种搜索策略:深度优先搜索、广度优先搜索和最佳优先搜索。所有书籍和文献都指出,广度优先和最佳优先将占用所用计算机的更多内存。这个怎么理解?以二叉树为例,从活节点列表中取出一个节点(父节点)进行处理时,会生成两个子节点(或子节点)并插入到活节点列表中,但父节点应该被删除,因此,只有一个节点的内存增加。从这个角度来看,这三种搜索策略都占用了计算机的相同内存。 我对吗?这让我困惑了很久。谁能给我一些建议?

【问题讨论】:

【参考方案1】:

嗯,

您可以考虑数据结构:

广度优先搜索:它被实现为一个队列。当您展开一个节点(父节点)时,您会将子节点包括在队列中。父节点被删除。 举个例子吧:

    展开45:我们在队列中包含20和70并删除45,所以:

    20 | 70

    扩展20:我们扩展队列中的第一个节点并包括他的儿子:

    70 | 10 | 28

    扩展70:我们扩展队列中的第一个节点并包括他的儿子:

    10 | 28 | 60 | 85

    等等……

如您所见,空间复杂度是指数:O()b = 分支因子;d = 深度,最初为 0

深度优先搜索:它是作为堆栈实现的:

    展开45:我们在堆栈中包含20和70并删除45,所以:

    20 | 70

    展开20:我们展开栈顶的第一个节点并包括他的儿子:

    10 | 28 | 70

    展开10:我们展开栈顶的第一个节点并包括他的儿子:

    1 | 18 | 28 |70

    等等……

现在空间复杂度是线性的:O(d)。两种算法的时间复杂度都是 O()。

Best-first-search:根据启发式评估函数f(n)对队列进行排序,并以最佳f(n)扩展后继。空间复杂度是线性的:O(d)

希望这会有所帮助。

【讨论】:

以上是关于如何理解分支定界中广度优先搜索的内存问题的主要内容,如果未能解决你的问题,请参考以下文章

深度优先算法 和 宽度优先算法 的优缺点

算法浅谈——走迷宫问题与广度优先搜索

用广度优先算法如何吃樱桃

广度优先搜索的理解与实现

初识广度优先搜索与解题套路

算法图解:广度优先搜索