在 C++ 中实现深度优先搜索

Posted

技术标签:

【中文标题】在 C++ 中实现深度优先搜索【英文标题】:Implementing depth-first-search in C++ 【发布时间】:2012-09-01 05:13:30 【问题描述】:

我正在学习数据结构和抽象数据类型,但我一直卡在一个不断出现的问题上。

我不明白计算机科学现在有 50 年的历史(或者更老,我不确切知道),以及数据结构、ADT 和算法如何成为这一切的基础部分,但仍然存在没有任何标准。

我的问题实际上非常具体:我正在尝试,其方式可以在任何本机(内置)数据类型上工作。我的问题是,我首先看哪里?我知道 STL 中的堆栈类可用于实现 DFS 算法,但 STL 是第一个看的地方吗?我应该从头开始实现 DFS,使用堆栈以及我对实现该算法的了解吗?还是专业程序员在需要进行此类搜索时是否有一个库?

请告知,这个问题并不像我希望的那样具体。

【问题讨论】:

不,你不需要任何库来做到这一点。很容易实现,我相信有很多例子。 @DarthVader "Swap" 更容易实现,并且有一个库函数。 对我来说,如果标准库(通常被错误地称为 STL)具有我需要的数据结构或算法,我会使用它。如果不是,那么我转向 Boost,如果它也不在 Boost 中,那么我开始进行更广泛的搜索(例如 Google 和 Wikipedia)。 @dsign 没有任何图形或树算法的库。没有一个 prog langs 这样做,因为有几种不同的方法可以做到这一点。你见过代表图形的 c# 或 java 库吗?我在军团工作,我们总是自己写。 @DarthVader 有很多库实现了图和树算法:例如 boost::graph。检查这个问题:***.com/questions/205945/…。它们不是 STL 的一部分,因为需求似乎不够高。另外,至少 boost::graph 是丑陋的。 【参考方案1】:

Boost 在这里有一个 C++ 深度优先搜索实现:

http://www.boost.org/doc/libs/1_42_0/libs/graph/doc/depth_first_search.html

【讨论】:

【参考方案2】:

运用你的知识!您了解 STL,并且知道如何使用堆栈实现 DFS,最重要的是,它非常简单,因此您可以自己编写代码。

大多数人建议使用 Boost。但是,如果这是您唯一需要 Boost 的事情,那么最好自己编写 DFS。另一方面,您还想学习如何使用已有的东西。

【讨论】:

+1:虽然我尊重 boost 社区,因为他们承担了像 boost 这样的重大依赖项所做的事情,这有其自身的成本,作为工程师,我们应该问自己什么是最大的成本——开发软件的有效途径。有时取依赖,有时回避依赖,自己实现。

以上是关于在 C++ 中实现深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

Java中的深度优先搜索

人工解数独(C++)深度优先搜索

广度优先搜索和深度优先搜索

深度优先搜索树与广度优先搜索树

Python二叉树的三种深度优先遍历

Python二叉树的三种深度优先遍历