Content
一、定义
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.时间复杂度
假设最大深度为 d d d,分支因子为 b b b(即每个节点的子节点数),则时间复杂度可分为以下部分:
-
深度限制为 k k k 时的搜索
每次深度限制为 k k k 时,DFS 的时间复杂度为 O ( b k ) O(b^k) O(bk),因为(该深度限制)最多访问 b k b^k bk 个节点。
-
总时间复杂度
IDS 会重复执行深度限制为 1 , 2 , ... , d 1, 2, \dots, d 1,2,...,d 的 DFS,因此总时间为:
O ( b 1 ) + O ( b 2 ) + ⋯ + O ( b d ) O(b^1) + O(b^2) + \dots + O(b^d) O(b1)+O(b2)+⋯+O(bd)这是一个等比数列求和,主导项为最后一层 O ( b d ) O(b^d) O(bd),因此最终时间复杂度为:
O ( b d ) O(b^d) O(bd)
2.空间复杂度
迭代深度搜索的空间复杂度与深度优先搜索一致,因为每次仅存储当前路径的节点:
-
栈空间占用
每次 DFS 最多存储从根节点到目标节点的路径,路径长度不超过深度限制 d d d,因此空间复杂度为 O ( d ) O(d) O(d)。
-
无额外存储
IDS 不需要像 BFS 那样存储所有已访问节点,仅需维护当前路径的栈。
关键点总结
- 时间 :与 BFS 相同( O ( b d ) O(b^d) O(bd)),但常数因子较高(因重复搜索浅层节点)。
- 空间 :与 DFS 相同( O ( d ) O(d) O(d)),远优于 BFS 的 O ( b d ) O(b^d) O(bd)。
- 优势:在空间受限时,IDS 是 BFS 的替代方案,保证最优解(针对无权图)。
伪代码及注释
python
def IDS(root, target):
depth = 0
while True: #循环调用DLS
found = 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 node
if depth > 0:
for child in node.children:
found = DLS(child, target, depth - 1)#在深度允许范围内递归搜索子节点
if found is not None:
return found
return 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。
伪代码示例:
python
def iterative_deepening_search(start, goal):
depth = 1
while True:#外层循环通过逐步增加深度限制(depth)进行迭代
result = depth_limited_search(start, goal, depth)#内层调用深度受限搜索(DLS)执行实际搜索
if result != "Not Found":
return result
depth += 1
适用场景
- 路径搜索问题:如迷宫求解、棋类游戏走法计算。
- 资源受限环境:内存有限但需保证最优解的场景。
- 无限状态空间:避免DFS陷入无限分支。
优缺点对比
优点:
- 内存效率高,仅需存储当前路径(类似DFS)。
- 保证找到最短路径(类似BFS)。
缺点:
- 重复搜索浅层节点,可能增加时间开销。
- 不适用于已知目标较深的场景。
通过结合DFS和BFS的特性,迭代深度搜索在实践中有广泛的应用价值。