迭代深度优先搜索与深度有限搜索有什么区别

迭代深度优先搜索与深度有限搜索的区别:1、概念不同;2、深度不同;3、原理不同。概念不同是指迭代深度优先搜索是一个用来寻找最合适的深度限制的通用策略,而深度有限算法是在深度优先搜索的基础之上,限制搜索深度。

一、迭代深度优先搜索与深度有限搜索的区别

1、概念不同

迭代深度优先搜索:迭代深度优先搜索是一个用来寻找最合适的深度限制的通用策略,它经常和深度优先搜索结合使用。

深度有限搜索:深度有限搜索是一种搜索方法,首先扩展根节点,然后扩展根节点的所有后继,接着再扩展它们的后继,从而一层一层的对节点进行扩展,但是限制搜索深度。

2、深度不同

迭代深度优先搜索:迭代加深搜索实质是限定下界的深度优先搜索,即首先允许深度优先搜索搜索 k 层搜索树,若没有发现可行解,再将 k+1 后再进行一次以上步骤,直到搜索到可行解。这个“模仿广度优先搜索”搜索法牺牲了时间,但节约了空间。如果有解,迭代深度优先搜索可以找到最浅的解,迭代深度优先搜索的深度是不断增加的。

深度有限搜索:深度有限搜索设定一个最大深度dmax,当搜索深度大于dmax的时候立即回溯,从而避免了在无穷状态空间中陷入深度无限的分支,深度有限搜索限制了搜索深度。

3、原理不同

迭代深度优先搜索:迭代深度优先搜索扩展根节点的一个后继,然后扩展它的一个后继,直到到达搜索树的最深层,那里的节点没有后继,于是迭代深度优先搜索回溯到上一层,扩展另外一个未被扩展的节点。在有限状态空间中,DFS是完备的,因为它可以把所有空间遍历一遍;而在无限空间中,DFS则有可能会进入深度无限的分支,因此是不完备的。DFS的时间复杂度为为O(b),而空间复杂度仅为O(d),因为我们只需要保存当前分支的状态,因此空间复杂度远远好于BFS。然而DFS并不能保证找到最优解。

深度有限搜索:深度有限搜索设定一个最大深度dmax,开始我们把dmax设为1,然后进行深度受限搜索,如果么有找到答案,则让dmax加一,并再次进行深度有限搜索,以此类推直到找到目标。这样既可以避免陷入深度无限的分支,同时还可以找到深度最浅的目标解,从而在每一步代价一致的时候找到最优解,再加上其优越的空间复杂度,因此常常作为首选的无信息搜索策略。

二、深度优先探索的迭代实现

DFS的迭代实现

DFS 的非递归的实现类似于BFS的非递归的实现但在两个方面与它不同:

  • 它使用一个 stack代替queue。
  • DFS 应该只在弹出顶点之后标记发现,而不是在推送它之前。
  • 它使用反向迭代器而不是迭代器来产生与递归的 DFS 相同的结果。

代码实现

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
 
// 存储Graph边的数据结构
struct Edge {
    int src, dest;
};
// 表示Graph对象的类
class Graph
{
public:
    // 表示邻接表的VectorVector
    vector<vector<int>> adjList;
    // Graph构造器
    Graph(vector<Edge> const &edges, int n)
    {
        // 调整Vector的大小以容纳 `n` 类型为 `vector<int>`
        adjList.resize(n);


        for (auto &edge: edges)
        {
            adjList[edge.src].push_back(edge.dest);
            adjList[edge.dest].push_back(edge.src);
        }
}}
// 从顶点 `v` 开始对Graph执行迭代 DFS
void iterativeDFS(Graph const &graph, int v, vector<bool> &discovered)
{
    // 创建一个用于迭代 DFS 的Stack
    stack<int> stack;

    // 将源节点压入Stack中
    stack.push(v);
 

    while (!stack.empty())
    {

        v = stack.top();
        stack.pop();

        if (discovered[v]) {
            continue;
        }

        discovered[v] = true;
        cout << v << " ";
        for (auto it = graph.adjList[v].rbegin(); it != graph.adjList[v].rend(); it++)
        {
            int u = *it;
            if (!discovered[u]) {
                stack.push(u);
            }}}}


int main()
{
    // 根据上Graph的Graph边Vector
    vector<Edge> edges = {

        {1, 2}, {1, 7}, {1, 8}, {2, 3}, {2, 6}, {3, 4},
        {3, 5}, {8, 9}, {8, 12}, {9, 10}, {9, 11}
    };

    // Graph中的节点总数(标记为 0 到 12)
    int n = 13;
 
    // 从给定的边构建一个Graph
    Graph graph(edges, n);
 
    // 跟踪是否发现了一个顶点
    vector<bool> discovered(n);
 
    for (int i = 0; i < n; i++)
    {
        if (discovered[i] == false) {
            iterativeDFS(graph, i, discovered);
        }
    }
    return 0;
}

三、搜索算法概述

搜索算法

搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。现阶段一般有枚举算法、深度优先搜索、广度优先搜索、A*算法、回溯算法、蒙特卡洛树搜索、散列函数等算法。在大规模实验环境中,通常通过在搜索前,根据条件降低搜索规模;根据问题的约束条件进行剪枝;利用搜索过程中的中间解,避免重复计算这几种方法进行优化。

迭代深度优先搜索与深度有限搜索有什么区别

递归树的引入

我们会发现无论是我们的正向穷举算法还是我们的递归式搜索枚举都可以产生一棵搜索树,而这颗搜索树也通常是辅助我们解决问题的关键,当然正向递推枚举会比递归枚举要快的多,其差别之一就是迭代式的搜索算法不会用到系统栈,而递归的搜索会大量的调用系统栈,因此引入了递归树。

延伸阅读

python实现深度有限搜索的算法原理

  1. 节点目标测试:通过,则返回成功;否则,判断 limit 是否为0,为0则返回失败。
  2. 设置限制标志:cutoff_occurred,初始值为False。
  3. 遍历节点的所有动作:每个动作产生子节点,递归子节点,参数中的深度:limit-1。递归结果返回到变量result,result如果为成功,则返回成功;如果是cutoff,则cutoff_occurred=True。(result有三种返回状态:failure,cutoff,node)。
  4. 如果cutoff_occurred为true:则返回cutoff,否则返回失败。

开发者生产力工具大全

从人工到自动化,从重复到创新,技术演进的历程中,都伴随着开发者工具类产品的发展,所以这里整理近几年口碑良好,使用广泛的22款程序员生产力工具。

1.研发项目管理与协作:PingCode

优点:让工作推进、进度/问题追踪、团队协作变得更简单,2021年研发项目管理榜单TOP1(36Kr)。

简介:覆盖研发全生命周期,广泛用于需求、版本、项目(敏捷/kanban/瀑布)、测试、缺陷、文档、效能等环节管理与协作。并且集成github、gitlab、jinkens等主流工具,支持私有部署、在线等多种部署使用方式。

教程/官网

2.任务管理/甘特图制作工具:Worktile

优点:功能成熟、性价比高、国内市场占有率最高的团队任务工具;

简介:在功能上Worktile 是一个工具集合,它具备OKR目标管理、项目管理、项目集管理、项目计划、项目风险、项目成本管理、企业网盘、审批、简报等能力。并且具备强大的自定义能力,能够配置出符合各种项目团队的流程、表单、字段、数据报表,以及具备丰富的模板市场。

官网/教程

3.分布式版本控制系统:Git

优点:分布式开发、速度快、灵活

简介:Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

教程/官网

4.数据库管理工具:Navicat

优点:高效、安全,最好用的数据库管理工具。

简介:“Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和 MongoDB 等不同类型的数据库,它与阿里云、腾讯云、华为云、Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud 和 MongoDB Atlas等云数据库兼容。

官网/教程

其余工具可通过《神级程序员都用什么工具?程序员生产力工具大全 》查看,以上均整理自该文章。

文章标题:迭代深度优先搜索与深度有限搜索有什么区别,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/48176

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月30日 下午7:05
下一篇 2023年3月30日 下午7:20

相关推荐

  • 管理系统的看板图用什么软件画

    画管理系统的看板图的软件:1、PingCode;2、Worktile;3、Teamhood;4、Eylean Board;5、Planner;6、Redmine;7、Miro;8、YouTrack。PingCode是一款专门为软件开发团队打造的看板工具。 1、PingCode PingCode是一款…

    2023年4月9日
    1200
  • 什么是面向切面编程AOP

    AOP即面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编…

    2023年1月12日
    6000
  • chromesetup是什么软件

    chromesetup是Windows操作系统中的一个可执行文件(程序),是谷歌浏览器安装程序。Google Chrome是由Google开发的一款设计简单、高效的Web浏览工具,该浏览器的目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。 一、chromesetup简介 Chrom…

    2023年3月17日
    8900
  • 项目书团队协作模块怎么写

    写项目书团队协作模块的步骤是:一、定义协作目标;二、确定协作工具;三、设计协作流程;四、实施协作流程;五、评估和优化协作流程。首先,需要明确协作目标,包括团队协作的目的和目标。这些目标应该与项目的整体目标密切相关。 一、定义协作目标 首先,需要明确协作目标,包括团队协作的目的和目标。这些目标应该与项…

    2023年4月27日
    2700
  • 如何保护和隐藏 IP 地址

    隐藏 IP 地址的两种主要方法包括:1、使用代理服务器,这是一个中介服务器,您访问的互联网服务器只会看到该代理服务器的 IP 地址,而不会看到您的 IP 地址;2、另一种则是使用虚拟专用网络 (VPN)。 一、如何保护和隐藏 IP 地址 隐藏您的 IP 地址是保护您的个人信息和在线身份的一种方式。隐…

    2022年10月24日
    14600
  • Apache Hadoop, IBM Symphony Platform, Aliyun ODPS, Tencent TDW 的区别与联系

    区别:Apache Hadoop属于开源的分布式计算基础架构。IBM Platform Symphony的一个核心优势是,它能屏蔽底层基础设施的复杂性。ODPS底层的基础架构和Hadoop类似,基本理论基础是Gooogle开放的那几篇论文。Tencent TDW是腾讯基于Hadoop生态圈的开源产品…

    2023年2月21日
    6700
  • 项目管理模板使用什么工具

    项目管理模板使用以下工具:一、PingCode;二、Worktile;三、Asana;四、Trello;五、Wrike。PingCode是国内软件研发项目管理软件。功能以及解决的问题有:能够支持看板、敏捷等多种项目的管理;管理团队目标,监控单/多项目的进度、管理计划分配资源。 一、PingCode …

    2023年4月29日
    1300
  • 在Scrum中,怎么有效的进行bug的管理

    在Scrum中,进行bug的管理应该分为三种情境:1、bug来自于正在开发的sprint;2、bug来自于已经结束的sprint;3、bug十分紧急,必须立刻修复。其中,如果bug来自于正在开发的sprint,会在task阶段就被标记为有bug,这个很容易解决。 1、bug来自于正在开发的sprin…

    2023年1月2日
    8100
  • 项目甘特图怎么做

    项目甘特图的做法:1、准备工作;2、安排任务;3、添加开始日期和结束日期;4、确定相关任务;5、验证是否包含所有必要的任务;6、在甘特图中添加标题;7、添加附加文档。准备工作是指,列出所有任务,并确定每个任务的管理者。 一、项目甘特图的做法 1、准备工作:列出所有任务,并确定每个任务的管理者。对于复…

    2023年2月22日
    8700
  • 软件开发文档包含哪些文档

    软件开发文档包含的文档:1、可行性分析报告;2、项目开发计划;3、软件需求说明书;4、概要设计说明书;5、详细设计说明书;6、用户操作手册;7、测试计划;8、测试分析报告等,可行性分析报告说明了该项目的实现在技术、经济和社会上的可行性。 1、可行性分析报告 说明该软件开发项目的实现在技术上、经济上和…

    2023年2月6日
    39700

发表回复

登录后才能评论
联系我们
站长微信
站长微信
分享本页
返回顶部