深度优先搜索基础知识

时间:2010-04-24 11:46:39

标签: algorithm tree depth-first-search

我正在尝试改进我目前针对8 Queens问题的算法,这是我第一次真正处理算法设计/算法。我想实现深度优先搜索,并结合此处描述的不同Y值的排列: http://en.wikipedia.org/wiki/Eight_queens_puzzle#The_eight_queens_puzzle_as_an_exercise_in_algorithm_design

我已经实现了排列部分来解决这个问题,但是我在深度优先搜索时遇到了一些麻烦。它被描述为遍历树/图的一种方式,但它是否生成树图?只有深度优先搜索生成要遍历的树结构时,通过实现某些逻辑才能生成树的某些部分,这似乎是唯一有效的方法。

基本上,我必须创建一个生成修剪过的lexigraphic排列树的算法。我知道如何实现修剪逻辑,但我不知道如何将其与置换生成器联系起来,因为我一直在使用next_permutation。

是否有任何资源可以帮助我进行深度优先搜索或以树形式创建lexigraphic排列的基础知识?

3 个答案:

答案 0 :(得分:2)

一般来说,深度优先搜索的想法是你不必为每个节点生成(或“访问”或“扩展”)。

在八皇后问题的情况下,如果你放置一个女王以便它可以攻击另一个女王,你可以中止那个分支;它不能导致解决方案。

如果您正在解决八皇后的变体,那么您的目标是找到一个解决方案,而不是全部92个,那么您可以在找到它后立即退出。

更一般地说,如果你正在解决一个不那么离散的问题,比如根据某种方法找到女王的“最佳”安排,那么你可以在你知道它不能导致最终状态优于你已经在另一个分支上找到的最终状态。这与A* search algorithm

有关

更一般地说,如果你正在攻击一个非常大的问题(如国际象棋),你可能会对一个不准确的解决方案感到满意,所以你可以中止一个可能不能解决的问题找到你已经找到的解决方案。

答案 1 :(得分:1)

DFS算法本身不生成树/图。如果你想构建树和图形,那么在执行搜索时就像构建它一样简单。如果您只想找到一个源,那么像链接列表这样的扁平LIFO数据结构就足够了:当您访问新节点时,将其附加到列表中。当您在搜索中离开节点回溯时,请关闭该节点。

答案 2 :(得分:1)

一本名为"算法简介"由anany levitan对你的理解有适当的解释。他还提供了解决8皇后问题的解决方案。这肯定会有所帮助。

根据我的理解,找到一个解决方案,你不需要任何排列,你所需要的只是dfs。找到解决方案就足够了吗