zoukankan      html  css  js  c++  java
  • 浅谈迭代加深搜索

    浅谈迭代加深

    本篇随笔简单讲解一下算法竞赛中搜索算法中的迭代加深DFS。

    为什么需要迭代加深

    先来上发讲解图:

    在学习迭代加深深搜之前,我们先简单回顾一下深搜。深搜的本质是对图的深度优先遍历。也就是“先往深了走,走完了没找到就换条路继续走”。对于那种无法一眼看出来是图论的问题,我们需要先把问题给定的条件抽象为一棵“搜索树”,然后在抽象出来的搜索树上进行深搜,解决问题。

    假设上图就是我们针对某一个问题所抽象出来的搜索树。我们给定答案节点是4号节点。

    那么,根据深搜的定义,我们进行算法的顺序是1-2-5-10-11-6-12-13-3-7-14-15-16-17-8-4-9.

    我们发现,直到最后两步才找到4.

    效率貌似很慢的样子。

    为什么呢?

    这是深搜本身的性质决定的,它的搜索顺序就是这样,这个算法不能“千变万化”,根据你问题的答案位置调整顺序,迭代加深也不行(你在想peach)。

    如果你说,为什么不用广搜?

    刚刚已经说过了,你设计的算法是成型投产的,你不可能针对一组数据,脑算出它的答案地点,然后再重新写程序吧?

    所以,当我们设计出一款深搜程序,又不想因为被出题人特殊构造数据卡掉的时候,也许我们需要迭代加深

    迭代加深的概念

    迭代加深的过程,就是每次对搜索的深度进行一个限制,如果在当前限定下搜不到答案,就把深度限制增加,然后重新进行一次搜索

    比如,对于刚刚的搜索树。

    假如限制是1,不行。

    限制是2,搜到,结束。

    假设答案是9号点的话,就再限制3,搜到,结束。

    但是要提及的是,我们的搜索方式并不是扩展,而是迭代。

    也就是说,限制是1,我们搜了1号点,没搜到答案。

    限制换成2的时候,我们就需要重新从1号点开搜,因为如果变成在原有基础上扩展的话,就变成广搜了。虽然没必要,但是对不起,人家算法就是这么设计的,你学就得了。

    所以,我们看得出来,这是一个低效率的算法,他的时间复杂度是呈指数级增长的。所以,它的试用条件是:

    当搜索树非常深,但是我们能确定答案一定在浅层节点时,就可以使用迭代加深DFS

  • 相关阅读:
    SQL 基础题。
    C# 多维数组.
    C# 泛型相关.
    C# 委托数组.
    ActiveX的数字签名
    Asp.Net Html标记替换.感谢个热心人。弄了好久.
    关于TableLayoutPanel里放入控件无法将Dock设为Fill的解决办法
    服务器×××上的MSDTC不可用解决办法
    vista home下运行asp.net2.0 程序环境配置
    麦克风的调节
  • 原文地址:https://www.cnblogs.com/fusiwei/p/12236592.html
Copyright © 2011-2022 走看看