C#,迭代深化搜索(IDS)或迭代深化深度优先搜索(IDDFS)算法的源代码

摘要:本文介绍适合于大数据规模情况下的,新型的迭代深化深度优先搜索(IDDFS)算法的原理、实例及实现的C#源代码。

引言

常用的树(或图)遍历算法是两种: 广度优先搜索算法(BFS)深度优先搜索算法(DFS)。然而在遇到巨大高度和宽度的树(或图)时,BFS 和 DFS 都不是非常有效。因为:

(1)DFS首先遍历通过根的一个相邻节点,然后遍历下一个相邻节点。这种方法的问题是,如果有一个节点靠近根,但不在DFS探索的前几个子树中,那么DFS到达该节点的时间很晚。此外,DFS可能无法找到到节点的最短路径(根据边的数量)。而,BFS 一级一级的走,但是需要更多的空间。

(2)DFS 需要的空间是 O(d),其中 d 是树的深度,但是 BFS 需要的空间是 O(n),其中 n 是树中的节点数(为什么?请注意,树的最后一级可以有大约 n/2 个节点,第二个最后一级可以有 n/4 个节点,在 BFS,我们需要让每一级都一个接一个地排队)。

IDDFS (迭代深化深度优先搜索,Iterative Deepening Depth-First Search,也简称为IDS)则是结合了深度优先搜索的空间效率和广度优先搜索的快速搜索(对于更接近根的节点)。

这里发布IDDFS 主要的原理性的代码,更全面的程序可在此基础上改进与增强。

一、IDDFS简介

迭代深化深度优先搜索(IDDFS)是一种算法,与BFS和DFS一样,它也是非信息搜索策略的重要组成部分。我们可以将IDDFS定义为BFS和DFS搜索技术的混合算法。在IDDF中,我们发现BFS和DFS存在一定的局限性,因此我们对这两种程序进行了混合,以消除它们各自的缺点。我们先进行有限深度搜索,直到固定的“有限深度”。然后,我们通过迭代过程不断增加深度限制,除非我们找到了目标节点或遍历了整个树(以较早的为准)。

二、IDDFS的工作原理

在非信息搜索策略中,BFS和DFS在最佳时间和空间搜索元素方面并不理想。这些算法只能保证在指数时间和空间中找到路径。因此,我们找到了一种方法,我们可以使用DFS的空间能力和BFS方法的最优解方法的融合,在那里我们开发了一种新的方法,称为迭代深化,使用这两种方法。这里的主要思想在于利用边界实体的重新计算,而不是囤积它们。每次重新计算都由DFS组成,因此占用的空间更少。现在让我们考虑在迭代加深搜索中使用BFS。

考虑将广度优先搜索转化为迭代加深搜索。

我们可以通过留出一个DFS来做到这一点,它将搜索到一个极限。它首先搜索到预定义的深度到深度的限制,然后生成路由长度1。

这是通过以DFS方式创建长度为1的路由来实现的。接下来,它为深度限制2、3及以上的路线让路。

它甚至可以在循环开始时删除所有之前的计算并进行迭代。因此,在某种程度上,如果树中存在任何问题,最终会找到解决方案,因为枚举是按顺序进行的。

伪代码:

IDDFS(T):
for d = 0 to infinity:if (DLS(T, d)):return 1elsereturn 0

为了实现迭代深化搜索,我们必须标记以下各项之间的差异:

(1)当达到深度极限界限时发生破裂。

(2)未达到深度界限的故障。

而在这种情况下,我们通过每次增加深度限制来多次尝试搜索方法,在第二种情况下,即使我们继续搜索多次,因为不存在解决方案,这意味着浪费时间。因此,我们得出结论,在第一种情况下,失败被发现是非自然的失败,在第二种情况下,失败是自然的。

三、IDDFS实例

咱们看看一个实例:

在给定的树中,起始节点是A,深度初始化为0。目标节点是R,我们必须找到到达它的深度和路径。图中的深度为4。在这个例子中,我们考虑树作为有限树,而我们也可以考虑同样的过程的无限树。我们知道在IDDFS算法中,我们首先进行DFS,直到指定的深度,然后增加每个循环的深度。这个特殊步骤是DLS或深度限制搜索的一部分。因此,下面的遍历显示了IDDFS搜索。

四、IDDF的优点和缺点

以下是优点和缺点。

1、优势

(1)IDDFS让我们有希望找到树中存在的解决方案。

(2)当在较低的深度(例如n)找到解时,该算法被证明是有效且及时的。

(3)IDDFS的最大优势是在博弈树搜索中发现,IDDFS搜索操作试图改进搜索节点的深度定义、启发式和得分,从而提高搜索算法的效率。

(4)IDDFS算法的另一个主要优点是响应速度快。早期结果是该算法的一个优点。在单独的迭代完成后,进行了多次改进。

(5)虽然在这里做了更多的工作,但IDDF的性能优于单独的BFS和DFS。

(6)空间和时间复杂性表示为:O(d),这里d被定义为目标深度。

(7)让我们考虑IDDFS的运行时间。假设b>l,其中b是分支因子,l是深度极限。然后,我们在边界k下搜索目标节点。在深度k上,我们说可能有只生成一次的节点。类似地,深度限制k-1处的节点是k-2深度的两倍和三倍。因此,在深度l处生成的节点是k倍。

2、缺点

(1)到达目标节点所需的时间是指数级的。

(2)IDDF的主要问题是在每个深度进行的时间和浪费的计算。

(3)情况并不像我们想象的那么糟糕,尤其是当分支因子被发现很高时。

(4)当BFS失败时,IDDF可能会失败。当我们要从IDDF中找到多个答案时,它会一次返回成功节点及其路径,即使在多次迭代后需要再次找到它。停止深度限制不会进一步增加。

五、结论

迭代深化深度优先搜索是BFS和DFS的混合算法。IDDF可能不会直接用于计算机科学的许多应用中,但该策略通过迭代增加深度限制来搜索无限空间的数据。这非常有用,在人工智能和新兴的数据科学行业中也有应用。

六、IDDFS的C#源代码

下面给出IDDFS的核心算法C#源代码。C#最优雅!

using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Algorithm.Graph
{public class NodeInfo{/// <summary>/// 序号/// </summary>public int Id { get; set; } = 0;/// <summary>/// 数据/// </summary>public string Value { get; set; } = "";/// <summary>/// 访问标识/// </summary>public bool Visited { get; set; } = false;/// <summary>/// 默认构造方法/// </summary>public NodeInfo(){}/// <summary>/// 构造函数/// </summary>/// <param name="id"></param>/// <param name="value"></param>public NodeInfo(int id, string value){Id = id;Value = value;}}/// <summary>/// 边信息/// </summary>public class EdgeInfo{/// <summary>/// 起点Id/// </summary>public int From { get; set; } = -1;/// <summary>/// 终点Id/// </summary>public int To { get; set; } = -1;/// <summary>/// 默认构造方法/// </summary>public EdgeInfo(){}/// <summary>/// 构造方法/// </summary>/// <param name="from"></param>/// <param name="to"></param>public EdgeInfo(int from, int to){From = from;To = to;}}/// <summary>/// 图信息/// </summary>public class IDDFS_Graph{/// <summary>/// 节点信息/// </summary>public List<NodeInfo> Nodes { get; set; } = new List<NodeInfo>();/// <summary>/// 图的边(连线)集合/// </summary>public List<EdgeInfo> Edges { get; set; } = new List<EdgeInfo>();/// <summary>/// 默认构造方法/// </summary>public IDDFS_Graph(){}/// <summary>/// 添加“边信息”用于构建“图”数据/// </summary>/// <param name="from"></param>/// <param name="to"></param>public void AddEdge(int idFrom, string valueFrom, int idTo, string valueTo){if (!Nodes.Exists(t => t.Id == idFrom)){Nodes.Add(new NodeInfo(idFrom, valueFrom));}if (!Nodes.Exists(t => t.Id == idTo)){Nodes.Add(new NodeInfo(idTo, valueTo));}Edges.Add(new EdgeInfo(idFrom, idTo));}/// <summary>/// 从 src 开始的有限深度搜索/// </summary>/// <param name="src"></param>/// <param name="target"></param>/// <param name="limit"></param>/// <returns></returns>private bool Depth_Limited_Search(int src, int target, int limit){if (src == target){return true;}if (limit <= 0){return false;}int i = Edges[src].From;while (i != Edges[src].To){if (Depth_Limited_Search(i, target, limit - 1) == true){return true;}i++;}return false;}/// <summary>/// 迭代深化深度优先搜索/// </summary>/// <param name="src">起点</param>/// <param name="target">目标</param>/// <param name="max_depth">最大深度差</param>/// <returns></returns>public bool IDDFS(int src, int target, int max_depth){// 深度控制for (int i = 0; i <= max_depth; i++){if (Depth_Limited_Search(src, target, i) == true){return true;}}return false;}}
}

改进的IDDFS在AI领域有很不错的表现。

值得继续研究与改进。

---------------------------------------------
POWER BY TRUFFER.CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyExcel的追加写入(新增POI、CSV)

总结&#xff1a;目前市面上流行的2种 EasyExcel和POI都不是真正的对物理excel文件进行追加导入。只是在缓存里面追加&#xff0c;最后一次性写入&#xff0c;并不能解决内存占用问题。 1.EasyExcel2.POI3.CSV 无非就是下面两种逻辑&#xff1a; 1.for循环查询数据&#xff0c;…

js中对数字,超大金额(千位符,小数点)格式化处理

前言 这个问题的灵感来自线上一个小bug&#xff0c;前两天刚看完同事写的代码&#xff0c;对数字类型处理的很好&#xff0c;之前一直都是用正则和toFixed(2)处理数字相关&#xff0c;后面发现使用numeral.js处理更完美。 对于下面这种数据的处理&#xff0c;你能想到几种方法…

燃情瞬间,智能酒精壁炉点亮户外聚会新潮流

在户外聚会中&#xff0c;一种备受瞩目的装饰品和功能性家居设备正逐渐崭露头角&#xff0c;那就是智能酒精壁炉。这种独特的户外装置不仅为聚会场合带来独特的氛围&#xff0c;还具有许多引人注目的优势。 其明亮的火焰不仅照亮整个场所&#xff0c;还散发出温暖迷人的光芒&am…

Git 大量log查看:git log --pretty=oneline

git log 是 Git 版本控制系统中的一个命令&#xff0c;用于展示一个或多个分支的提交历史记录。 当你在 git log 命令后面添加 --prettyoneline 选项时&#xff0c;它会以单行的形式显示提交历史。这意味着每个提交将会在一行内显示&#xff0c;而不是默认的多行显示格式。 具…

浅谈WPF之Popup弹出层

在日常开发中&#xff0c;当点击某控件时&#xff0c;经常看到一些弹出框&#xff0c;停靠在某些页面元素的附近&#xff0c;但这些又不是真正的窗口&#xff0c;而是页面的一部分&#xff0c;那这种功能是如何实现的呢&#xff1f;今天就以一个简单的小例子&#xff0c;简述如…

Python Matplotlib 库使用基本指南

简介 Matplotlib 是一个广泛使用的 Python 数据可视化库&#xff0c;它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图&#xff0c;Matplotlib 提供了丰富的功能来满足我们的数据可视化需求。本指南将详细介绍如何安装、基本绘图函数以及常见…

FindTheIndexOfTheFirstOccurrenceInAString 【找到第一个匹配的下标】

双指针 字串的所有的字符都匹配完&#xff0c;匹配成功。 如果要与之匹配的字符串剩下的长度小于字串的长度&#xff0c;即剩下的已经不会再满足。 public int strStr(String haystack, String needle) {int index -1, i0, j0;for(i0; i<haystack.length()-needle.length(…

贪心算法Day06

#738.单调递增的数字 力扣题目链接(opens new window) 给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们…

【Redis】Redis面试热点

Redis 集群有哪些方案&#xff1f; 主从复制&#xff1a;解决了高并发问题 哨兵模式&#xff1a;解决了高并发&#xff0c;高可用问题 分片集群&#xff1a;解决了海量数据存储&#xff0c;高并发写的问题 主从复制 图示&#xff1a; 主从复制&#xff1a;单节点 Redis 并发…

NPN PNP SS8050 SS8550 S8050

SS8050的使用及引脚判断方法 今天讲的是NPN型三极管SS8050&#xff0c;主要分为以下几个方面&#xff1a; 一、前言 二、SS8050简介 三、NPN三极管与PNP三极管 四、三极管管脚识别方法 五、不拆卸三极管判断其好坏 六、S8050和SS8050的区别 七、三极管与MOS管的区别 八…

nginx基础面试题以及配置文件解析和命令控制

目录 1、nginx是什么 2、nginx的特点 3、为什么中国大陆有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等这么多用户使用nginx 4、nginx 的内部技术架构 上一期我们配置安装了nginx接着讲一下nginx配置文件的解析和nginx 命令控制 感谢观看&#xff01;希望能够帮助到…

mapper向mapper.xml传参中文时的乱码问题

1.起因&#xff1a; 在idea中进行模糊查询传参时&#xff0c;发现在idea中查中文查不出记录&#xff0c;在navicate中可以查出来。 2.猜测&#xff1a; 1.idea中的编码问题导致的乱码。 2.idea和navicate的编码一致性导致的乱码。 3.mapper向mapper.xml传参后出现乱码。 3.解…

Qt之数据转换与处理

从串口读取到的QByteAray数据一般需要进行提取和解析&#xff0c;此时就需要将QByteArray数拒转换为各种类型的数据。常用的转换包括&#xff1a; &#xff08;1&#xff09; 转为Hex&#xff0c;用于显示十六进制&#xff0c;这点在调试时特别有用&#xff0c;因为大多HEX码是…

【Vue技巧】Vue2和Vue3组件上使用v-model的实现原理

ChatGPT4.0国内站点&#xff0c;支持GPT4 Vision 视觉模型&#xff1a;海鲸AI 在Vue中&#xff0c;v-model 是一个语法糖&#xff0c;用于在输入框、选择框等表单元素上创建双向数据绑定。当你在自定义组件中实现 v-model 功能时&#xff0c;你需要理解它背后的原理&#xff1a…

DFA算法实战-敏感词过滤

前言 这里的项目实战, 我们使用的是 SpringBoot2.xJDK1.8搭建的,核心思想是借助了Hutool工具类的 WordTree。想了解更多DFA算法的实现可以参考DFA算法的实现 实战案例 1. 引入Hutool的工具类 <dependency><groupId>cn.hutool</groupId><artifactId>…

Python 基础【八】--数据类型-字典【2024.1.11】

1.定义 字典的内容在花括号 {} 内&#xff0c;键-值&#xff08;key-value&#xff09;之间用冒号 : 分隔&#xff0c;键值对之间用逗号 , 分隔&#xff0c;比如创建字典 &#xff0c;如下所示&#xff1a; d{name:小明,age:18}# 使用 dict 函数&#xff1a;强转 # 方式一&am…

mysql group by 之后要把名字放到一个字段里边

分组后的其他字段去重 count(DISTINCT(product)) num_sold,分组后数据存放到一个字段 &#xff08;带着排序&#xff0c;在保存到一个字段&#xff09; group_concat(distinct product order by product separator ‘,’) select sell_date,count(DISTINCT(product)) num_so…

PX4开源项目中遇到的问题

开源项目 kaiyuanxiangmkmonemati/PX4-ROS2-Gazebo-YOLOv8: Aerial Object Detection using a Drone with PX4 Autopilot and ROS 2. PX4 SITL and Gazebo Garden used for Simulation. YOLOv8 used for Object Detection. (github.com) 首先创建python虚拟环境&#xff0c;克…

【一文详解】知识分享:(ASP.Net Core基础学习及快速入门)

背景知识 相关术语 .Net .NET是微软的一个开发平台&#xff0c;这个平台的一大特点就是跨语言性&#xff0c;不管是什么语言&#xff0c;c、c、c#、F#、J#、vb等语言都可以用这个平台合作开发&#xff1b; .NET&#xff0c;它是微软创建的一个用于构建多种不同类型的应用程…

python——combinations()函数详解

combinations() 函数位于 Python 的 itertools 模块中&#xff0c;用于生成一个可迭代对象&#xff0c;包含输入集合中所有长度为 r 的组合。 定义&#xff1a; combinations(iterable, r) 函数接受一个可迭代对象 iterable 和一个整数 r&#xff0c;返回一个包含所有长度为 r…