对于搜索的新理解

Posted DDYYZZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于搜索的新理解相关的知识,希望对你有一定的参考价值。

搜索是什么?

1.问题全状态空间

2.搜索空间

3.解路径

分类

一,盲目搜索(只是搜索的顺序不同)

1.深度优先搜索

2.宽度优先搜索

二,启发式搜索

A*算法

分类来讲

1.深度优先搜索

例题:皇后问题

存在的问题:1.深度问题,2.死循环问题

解决办法:1.对搜索深度加以限制

                  2.记录从初始状态到当前状态的路径

性质:一般不能保证找到最优解

          当深度现在不合理时,可能找不到解,可以将算法改为可变深度限制

          最坏的情况,搜索空间相当于穷举

          是一个通用的与问题无关的方法

        节省内存,只存储从初始节点到当前节点的路径

2.宽度优先搜索

优先扩展深度浅的节点

通常用一个队列来实现

例题:八数码

性质:当问题有解时,一定能找到解

          当问题为单位耗散值,且问题有解时,一定能找到最优解

          方法与问题无关,具有通用性

          效率较低

          存储量比较大

【对比】

 

             深搜  广搜           
不保证最优解,除非枚举所有情况 每步代价相同时,一定能找到最优解
空间消耗低 空间消耗高
具有通用性
效率低

迭代加深搜索(dbfs)

解决宽搜内存大和深搜不能保证最优解的问题

解决方案:枚举最大的代价,用深搜判断是否有解--》卡时间

3.启发式搜索(A*搜索)

关键在于对当前局面作出预估,判断当前局面到目的的局面至少还需要多少步

估价函数决定了A*算法的优劣

练习题:1.01迷宫

               2.高手去散步

               3.血色先锋队

以上是关于对于搜索的新理解的主要内容,如果未能解决你的问题,请参考以下文章

二叉搜索树的理解以及AVL树的模拟实现

二叉搜索树的理解以及AVL树的模拟实现

Java8-11的新特性和理解的误区

看图轻松理解数据结构与算法系列(二叉搜索树)

深入理解Java注解类型

一个初学者对于MVC架构的理解