我一直在阅读有关迭代加深的信息,但我不了解它与深度优先搜索有何不同。
我了解深度优先搜索的范围越来越广。
在迭代加深中,您将建立一个级别的值,如果该级别上没有解决方案,则可以增加该值,然后从头开始(根)重新开始。
这与深度优先搜索不一样吗?
我的意思是,您将不断增加,直到找到解决方案为止。我认为这是同一件事!我将沿着同一个分支,因为如果我从头开始,我将像以前一样沿着同一个分支。
最佳答案
在深度优先搜索中,您从图形中的某个节点开始,并不断深入地探究图形,同时可以找到尚未到达的新节点(或直到找到解决方案)。每当DFS用尽移动时,它都会回溯到可以做出不同选择的最新点,然后从那里进行探索。如果您的图非常大并且只有一个解决方案,那么这可能是一个严重的问题,因为您可能最终会沿着一条DFS路径浏览整个图,而只是在查看每个节点后才找到解决方案。更糟糕的是,如果图形是无限的(例如,您的图形可能由所有数字组成),则搜索可能不会终止。而且,一旦找到了所要查找的节点,您可能就没有最佳路径了(您可能已经遍历整个图以寻找解决方案,即使它正好位于开始节点旁边!)
解决此问题的一种可能方法是限制DFS采取的任何一条路径的深度。例如,我们可能会执行DFS搜索,但是如果我们选择的路径长度大于5,则停止搜索。这确保了我们永远不会探索与起始节点之间的距离大于5的任何节点,这意味着我们永远不会探索无限搜索或(除非图非常密集)我们不搜索整个图。但是,这确实意味着我们可能找不到所需的节点,因为我们不一定要探索整个图。
迭代加深的思想是使用第二种方法,但要在每个级别上不断增加深度。换句话说,我们可以尝试使用长度为1的所有路径,然后长度为2的所有路径,然后长度为3的路径,等等,直到最终找到所讨论的节点。这意味着我们永远不会沿着无限的死路探索,因为每条路径的长度在每一步都受到一定长度的限制。这也意味着我们找到了到达目标节点的最短路径,因为如果我们在深度d处找不到该节点,但在深度d + 1处找到了该节点,那么就不会有长度为d的路径(或者这样就可以了),因此长度d + 1的路径确实是最佳的。
之所以与DFS不同,是因为它永远不会遇到这样的情况,即它在图形周围花费了极其长而circuit回的路径而没有终止。路径的长度始终受限制,因此我们永远不会探索不必要的分支。
之所以与BFS不同,是因为在BFS中,您必须一次将所有边缘节点保存在内存中。这需要内存O(bd),其中b是分支因子。将此与迭代加深中的O(d)内存使用情况进行比较(以保留当前路径中每个d节点的状态)。当然,BFS永远不会多次探索相同的路径,而迭代加深可能会随着深度限制的增加而多次探索任何路径。但是,两者渐近地具有相同的运行时间。在考虑了距离d的所有O(bd)节点后,BFS以O(bd)步骤终止。迭代加深在每个级别使用O(bd)时间,总和总计为O(bd),但常数因子较高。
简而言之:
希望这可以帮助!