浅谈搜索

搜索作为最基础的算法之一是十分重要的,虽然思想简单但是使用得当后效果也会非常好。本文就从搜索的基础来讲(无图,语言混乱求轻喷)。

什么是搜索?

  简单地理解就是通过暴力计算,枚举后去找到正确答案,比如1到10有几个奇数这个问题,从搜索的角度来考虑就是一个循环1到10每个判断一下是不是奇数,然后得出结果(也许此处比喻有点问题,但总体意思差不多)。遇到一些复杂问题时,如果不考虑时间复杂度的情况下,搜索总是奏效的。

搜索的不同种类

  DFS:深度优先搜索  

   和字面一样,这种搜索方法以深度为优先,当搜索情况出现问题时就回溯,也就是说在状态改变时会从当前状态直接改变,而不是存储下当前状态以便之后搜索(也就是之后的BFS),这么说可能比较抽象,举一道经典的例子。

    数字三角形:https://www.luogu.org/problemnew/show/P1216

    尽管这是一道动态规划的经典例题,但在解释搜索时及其好用。
   5
   7
   3 8
   8 1 0
   2 7 4 4
  4 5 2 6 5 

  假设搜索顺序先左后右的话, 我们首先从最顶端的7往下搜索,接着搜到3,再从3往下搜,这样的话就会先搜到最后一排最左边的4,此时数字相加得到一个结果,这之后因为4下面没有数字了,便回溯到上面的2接着往5搜索,最后我们便能搜遍这里面搜有的路径可能, 从而找出最大的和。

   给出DFS的伪代码:

dfs(int i)
{
  int j;
  for(j=1;j<=maxj;j++) 
     if(新结点符合条件)
       {
        记录新结点;
        if(到目标结点)  输出;
        else dfs(i+1);
        删除结点;
       }
   return 0;
}

   BFS:广度优先搜索

    广搜解释起来就比较轻松了(因为ywd上课讲了一个非常生动的例子),就是讲有些国家有几百个王子,那么我们假设国王就是最上面一代,那国王的第一继承人就是他的大儿子,而第二继承人就是他的二儿子(注意,第二继承人并不是他的大儿子的大儿子而是他大儿子的大弟弟),那假如国王所有儿子都安排上了,那接下来就轮到大儿子的大儿子了,广搜基本就是这样一个思路,同样举一道经典的例子。

     八数码:https://www.luogu.org/problemnew/show/P1379

     这题主要思想就是移动空位而不是有数字的位置,然后记录下不同的状态,然后按照上面说的顺序一步步往下搜(从状态0生出状态1,2,3,然后状态1生出状态4,5,6,但接着从状态2接着生),因为没有遗漏任何一种情况,所以得出的一定是最优解,事实上广搜通常也用来找最优解。

     不过如果大家如果玩过windows7里面有个小工具有个拼图板,有一种最简单的图片就是十五数码,也就是4*4的,你们可能就会知道这个东西的策略。我一般是先弄1,2,然后把3弄在4的位置上,4弄在8的位置上,这样就能先弄出1,2,3,4,接着弄好5,然后把9弄在13的位置上,13弄在14位置上,这样竖着的1,5,9,13也弄好了,剩下就转变成了八数码,也可以用这个策略解决。不过韩神在英语听说课上曾经花了5分钟研究这个事情,他是这样说的,15数码有解的条件是讲各位上的数字排成一列,逆序对个数为偶数(逆序对为ai>aj,i<j),而最终的目标是逆序对为0,那解决方法是通过%¥&*(这里开始我没看懂,视觉效果就是韩神一直在让数字转圈,然后就弄出来了)。

      给出广搜的伪代码:

bfs()
{
  建立数据库;
  初始状态入队;
  head=0;tail=1;(首尾指针)
  do{head++;//队首扩展
  for(i=1;i<=imax;i++)
    if(新结点符合条件)
      {
       tail++;
       新结点入队;
       if(新结点与原有结点重复)  tail--;
       else if(新结点是目标结点)  输出并退出;}
     }while(head<tail);
   输出无解;
 }

搜索的技巧

深搜剪枝

最优化剪枝//可行性剪枝

     还是上面深搜的那道题,假如它求的是路径之和最小,那么我们可以记录下当前最小的路径之和,然后在搜索时对比,若大于路径之后就回溯,这是最优化剪枝。可行性剪枝也类似,判断是否能达成目标,不能就回溯。

记忆化搜索

      顾名思义,将状态记住,例如我们假如用搜索求斐波那契数列的第10000项(虽然很蠢),fib(n+2)=fib(n+1)+fib(n),这样同一个函数可能运算多遍,但计算一次后记住结果就可明显提升速度。

玄学剪枝:这个假如搜索用多了,自然会懂的。

广搜优化

启发式搜索

   假如你做八数码这个题不用任何优化技巧,基本跑的不会很快,启发式搜索类似人的思维,即优先运算与目标结点“看起来近”的,用一个估值函数来判断这个相似度(通常包括深度,相似度等),不过看起来近未必就真的近,所以启发式搜索有可能找到的不是最优解,不过这个东西类似spfa,没人针对你的时候跑的飞快,用了启发式搜索,十五数码随便跑。

哈希判重

    但不用启发式搜索八数码也能解决,我就用的是一个八维数组(九维空间不够,八维足够推出剩下一个数的位置,大佬轻喷,我当时真的不知道什么康托展开),这种方式能减少重复情况的出现来提升计算速度。

双向广搜

     具体思路是从目标状态和初始状态同时开始搜,如果状态有重合,那么就结束。如果画两棵搜索树,就能很直观地看到它的优点。

其他优化(仅供了解)

结合数据结构

模拟退火(可以了解下这题):https://www.luogu.org/problemnew/show/P3959

迭代加深搜索

如何练习搜索:找数据量较小的动态规划题(光速逃)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能领域涵盖了很多不同的方向,这些方向基于不同的算法和技术,可以用于解决不同的问题。下面将就人工智能领域的几个主要方向进行一些浅谈。 1. 机器学习:机器学习是人工智能领域的一个重要方向,它让计算机能够在没有明确的指示下学习和提高自己的性能。机器学习可以分为监督学习、无监督学习和强化学习等。监督学习是利用标记过的数据,让计算机学习如何进行分类、回归等任务。无监督学习是从无标记的数据中抽取特征并进行分类。强化学习是计算机利用反馈机制不断修正自己的决策策略。 2. 自然语言处理:自然语言处理是一种利用计算机对人类自然语言进行处理的技术。其主要的应用包括语音识别、自然语言理解和自然语言生成等。自然语言处理的发展,将使得计算机能够更好地理解人类的语言,进而实现人机交互和自然语义搜索等功能。 3. 计算机视觉:计算机视觉是指通过计算机对视觉对象进行的识别和学习技术。其应用范围非常广泛,包括人脸识别、场景理解、视觉检测等。随着深度学习算法的发展,计算机视觉领域实现了很多重大突破。 4. 人机交互:人机交互是指人和计算机之间通过各种方式进行沟通交流的技术。该领域涵盖了诸多方向,包括语音识别、手势识别、触摸界面等。人机交互的发展将会让人们更加方便地使用计算机和智能设备,提高其工作和生活效率。 以上这些方向仅仅是人工智能领域的冰山一角,随着科技的进步和人们对于AI技术应用的探索,我们可以期待更多有趣的应用会不断涌现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值