【数据结构+算法】迭代深度搜索(IDS)及其时间复杂度和空间复杂度
Content
- 一、定义
- 1.迭代深度搜索(IDS)的定义
- 2.核心原理
- 二、分析
- 1.时间复杂度
- 2.空间复杂度
- 关键点总结
- 伪代码及注释
- 三、算法步骤
- 适用场景
- 优缺点对比
一、定义
1.迭代深度搜索(IDS)的定义
迭代深度搜索(Iterative Deepening Search, IDS)是一种结合了深度优先搜索(Depth First Search, DFS)和广度优先搜索(Breadth First Search, BFS)优点的搜索策略。它通过逐步增加搜索深度的限制,重复执行DFS,直到找到目标解或达到最大深度。这种方法的优势在于既能节省内存(类似DFS),又能确保找到最短路径(类似BFS)。
2.核心原理
迭代深度搜索从深度限制为1(比如设maxdep=1)开始,执行一次完整的DFS。若未找到目标,将深度限制加1(maxdep++),重新执行DFS。每次迭代都会探索更深的层级,直到目标被发现或资源耗尽。这种方式避免了BFS的高内存消耗,同时解决了DFS可能陷入无限分支的问题。
二、分析
1.时间复杂度
假设最大深度为 ddd,分支因子为 bbb(即每个节点的子节点数),则时间复杂度可分为以下部分:
-
深度限制为 kkk 时的搜索
每次深度限制为 kkk 时,DFS 的时间复杂度为 O(bk)O(b^k)O(bk),因为(该深度限制)最多访问 bkb^kbk 个节点。 -
总时间复杂度
IDS 会重复执行深度限制为 1,2,…,d1, 2, \dots, d1,2,…,d 的 DFS,因此总时间为:
O(b1)+O(b2)+⋯+O(bd)O(b^1) + O(b^2) + \dots + O(b^d)O(b1)+O(b2)+⋯+O(bd)
这是一个等比数列求和,主导项为最后一层 O(bd)O(b^d)O(bd),因此最终时间复杂度为:
O(bd)O(b^d)O(bd)
2.空间复杂度
迭代深度搜索的空间复杂度与深度优先搜索一致,因为每次仅存储当前路径的节点:
-
栈空间占用
每次 DFS 最多存储从根节点到目标节点的路径,路径长度不超过深度限制 ddd,因此空间复杂度为 O(d)O(d)O(d)。 -
无额外存储
IDS 不需要像 BFS 那样存储所有已访问节点,仅需维护当前路径的栈。
关键点总结
- 时间:与 BFS 相同(O(bd)O(b^d)O(bd)),但常数因子较高(因重复搜索浅层节点)。
- 空间:与 DFS 相同(O(d)O(d)O(d)),远优于 BFS 的 O(bd)O(b^d)O(bd)。
- 优势:在空间受限时,IDS 是 BFS 的替代方案,保证最优解(针对无权图)。
伪代码及注释
def IDS(root, target):depth = 0while True: #循环调用DLSfound = DLS(root, target, depth)if found is not None: #目标节点一旦找到赶紧返回return found depth += 1 #每次迭代深度+1实现广度优先的深度扩展def DLS(node, target, depth):if depth == 0 and node == target: #当达到指定深度且节点匹配时返回目标return nodeif depth > 0:for child in node.children:found = DLS(child, target, depth - 1)#在深度允许范围内递归搜索子节点if found is not None:return foundreturn None
“”"
关于时间复杂度和空间复杂度(整理自baike.baidu.com)
算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。
为了计算时间复杂度,通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。相同大小的不同输入值仍可能造成算法的运行时间不同,因此我们通常使用算法的最坏情况复杂度,记为T(n),定义为任何大小的输入n所需的最大运行时间。
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1)。
空间复杂度是衡量算法在运行过程中所需内存空间的大小,通常用 S(n) 表示。它反映了算法在处理数据时占用内存的增长趋势,常见的空间复杂度有:
• O(1):表示使用的空间是常量,不随输入规模变化。
• O(n):表示使用的空间与输入规模成线性关系。
• O(n²):表示使用的空间与输入规模的平方成正比。
空间复杂度的计算包括输入空间、暂存空间和输出空间等。
“”"
三、算法步骤
- 初始化深度限制:设置初始深度限制
d = 1
。 - 执行深度受限DFS:在深度限制
d
内进行DFS,若找到目标则终止。 - 递增深度:若未找到目标,将
d
增加1,重复步骤2。
伪代码示例:
def iterative_deepening_search(start, goal):depth = 1while True:#外层循环通过逐步增加深度限制(depth)进行迭代result = depth_limited_search(start, goal, depth)#内层调用深度受限搜索(DLS)执行实际搜索if result != "Not Found":return resultdepth += 1
适用场景
- 路径搜索问题:如迷宫求解、棋类游戏走法计算。
- 资源受限环境:内存有限但需保证最优解的场景。
- 无限状态空间:避免DFS陷入无限分支。
优缺点对比
优点:
- 内存效率高,仅需存储当前路径(类似DFS)。
- 保证找到最短路径(类似BFS)。
缺点:
- 重复搜索浅层节点,可能增加时间开销。
- 不适用于已知目标较深的场景。
通过结合DFS和BFS的特性,迭代深度搜索在实践中有广泛的应用价值。