我正在阅读https://www.ics.uci.edu/~welling/teaching/271fall09/UninformedSearch271f09.pdf
的讲座BFS中的内存使用量为O(b ^ d + 1),ID-DFS中的内存使用量为O(bd)。
我想检查一件事,为什么ID-DFS不存储所有访问过的节点?
我弄清楚的原因是它只需要存储路径以及它在路径上展开的节点。对于其访问过的路径之外的其他节点,可以从树中丢弃(从内存中释放它们),因为这些节点不利于从根目录指向目标节点。
对于BFS,因为我们不知道解决方案的位置,所以在找到解决方案之前,我们不能丢弃我们访问过的节点。
以上思想是正确还是错误?
注意: 更准确地说,在ID-DFS中,据我所知,在访问节点时,我们应该生成所有合法的孩子,比如n个孩子,并访问第一个孩子n1。对于第二个孩子n2,将访问它直到有限深度的DFS完成搜索n1。这就是为什么ID-DFS中的内存使用量为O(bd),分支因子乘以深度的原因。对于某些应用程序,它不需要在访问节点时生成所有子节点,它只能生成第一个子节点;对于第二个孩子,可以在搜索n1后生成并返回。对于这样的修改,它只需要存储路径,因此其内存使用量为O(d)。
答案 0 :(得分:0)
我认为这是人工智能课程的内容。
让我们首先确保我们讨论树搜索而不是图搜索。在树搜索中,您只需要一个条纹,同时在图形搜索中需要条纹和近距离集合。边缘通常是一个pripority队列,只是存储要访问的节点。对于BFS和DFS,它们可以分别减少到队列和堆栈。对于图搜索,close集将用于存储已访问所有子节点的节点,以便修剪不必要的重复搜索。
考虑一个搜索树,每个节点都有b
子节点和m
层。
时间复杂性:DFS需要O(b^m)
找到一个解决方案,而BFS需要O(b^s)
找到一个解决方案,其中s
是最浅解的深度。
空间复杂性:空间复杂性指的是边缘将消耗的最大尺寸。 DFS只需要O(bm)
,因为它只需要在通向root的路径上存储slibing节点,而BFS大致采用最后一层,即O(b^s)
以下是DFS与BFS的说明:
我们可以很容易地看到,在大多数情况下,使用BFS比使用DFS找到一个解决方案更快,但DFS占用的内存比BFS少。因此,ID-DFS只是BFS和DFS的组合。因此,要搜索深度d,内存消耗与DFS相同,即O(bd)
。