【问题标题】:Depth First Search Basics深度优先搜索基础
【发布时间】:2010-04-24 11:46:39
【问题描述】:

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

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

所以本质上,我必须创建一个算法来生成一个修剪过的字典排列树。我知道如何实现修剪逻辑,但我只是不确定如何将它与排列生成器联系起来,因为我一直在使用 next_permutation。

是否有任何资源可以帮助我了解深度优先搜索的基础知识或创建树形字典排列?

【问题讨论】:

    标签: algorithm tree depth-first-search


    【解决方案1】:

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

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

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

    更一般地说,如果您要解决一个不那么离散的问题,例如根据某种度量找到皇后的“最佳”排列,那么您可以在知道它不会导致最终状态更好的情况下立即中止分支您已经在另一个分支上找到的最终状态。这与A* search algorithm有关。

    更一般地说,如果您要解决一个非常大的问题(例如国际象棋),您可能会对不精确的解决方案感到满意,因此您可以中止 可能 无法解决的分支找到您已经找到的解决方案。

    【讨论】:

      【解决方案2】:

      DFS 算法本身不会生成树/图。如果要构建树和图,构建它就像执行搜索一样简单。如果你只想找到一个解决方案,像链表这样的扁平 LIFO 数据结构就足够了:当你访问一个新节点时,将它附加到列表中。当您在搜索中留下要回溯的节点时,将节点弹出。

      【讨论】:

        【解决方案3】:

        anany levitan 的一本名为“算法简介”的书对您的理解有适当的解释。他还按照您描述的方式提供了 8 个皇后问题的解决方案。它肯定会帮助你。

        据我了解,要找到一种解决方案,您不需要任何排列,您所需要的只是 dfs。找到解决方案就足够了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-31
          • 1970-01-01
          • 1970-01-01
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多