ACM培训

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4我们现在这个主题“搜索 ” 我们现在这个主题 “搜索”即是对状 态空间搜索:
如果按专业点的说法就是将问题求解过 程表现为从初始状态到目标状态寻找这 个路径的过程。 个路径的过程。 通俗点说, 就是在解一个问题时, 通俗点说 , 就是在解一个问题时 , 找到 一条解题的过程可以从求解的开始到问 题的结果。 题的结果。
5.A*算法
由于求解问题的过程中分枝有很多, 由于求解问题的过程中分枝有很多,主 要是求解过程中求解条件的不确定性, 要是求解过程中求解条件的不确定性, 不完备性造成的, 不完备性造成的,使得求解的路径很多 这就构成了一个图, 这就构成了一个图,我们说这个图就是 状态空间。 状态空间。 问题的求解实际上就是在这个图中找到 一条路径可以从开始到结果。 一条路径可以从开始到结果。这个寻找 的过程就是状态空间搜索。 的过程就是状态空间搜索。
6.搜索树
3. 静态最优查找树/次优查找树:考虑到上面折半查 静态最优查找树/ 找在概率问题下的效率不行, 找在概率问题下的效率不行,我们就想能不能把折半 查找二叉树中概率最大的数据放在根的位置上或者放 在离根较近的位置上?基于此,静态最优查找树/ 在离根较近的位置上?基于此,静态最优查找树/次优 查找树的思想就是在折半查找二叉树的基础上求解一 个带权(数据被查找概率)路径长度最小/近视最小的树。 个带权(数据被查找概率)路径长度最小/近视最小的树。 总体上说, 静态最优 / 总体上说 , 静态最优/ 次优查找树的时间复杂度也在 O(log2 N)数量级上( O(log2 N)数量级上(特别是在数据具有查找概率的情 况下也能保证这个效率) 况下也能保证这个效率)。
2010暑假培训 2010暑假培训
7.20~ 7.20~7.26
第一阶段主要内容
1.枚举算法 2.深度优先搜索 3.广度优先搜索(Broad First Search) 广度优先搜索( Search) 4.双向广度优先搜索 5.A*(A-Star)算法 A*( Star)算法 6.搜索树 7.归并排序 8.基数排序 9.桶排序
2.深度优先遍历
这是一棵状态树 有两个特点:
1.结点之间是树 1.结点之间是树 状关系 2.结点是“状态” 2.结点是“状态”
3.广度优先遍历
广度优先搜索(BFS)与DFS不同,BFS 广度优先搜索(BFS)与DFS不同,BFS 是最先产生的节点,最后扩展。 堆栈在这里就不适用了。因此,我们选用 队列为BFS的主要数据结构。 队列为BFS的主要数据结构。 广度优先会扩展出很多结点,这是一个负 面的问题。
6.搜索树
2.折半查找:很显然的一个例子就是利用折半查找 (二分查找) 法对有序的线性数据进行查找。每一次都 二分查找) 法对有序的线性数据进行查找。 找(前一次查找范围的)1/2的部分,查找次数当然就 前一次查找范围的) 的部分, 大大减少了。时间复杂度在O(log N)数量级上。 大大减少了。时间复杂度在O(log2N)数量级上。 折半查找实际就是一颗二叉树遍历, 折半查找实际就是一颗二叉树遍历,其中最中间的数 据就是二叉树的根。但是问题又来了, 据就是二叉树的根。但是问题又来了,如果这个根数 据一年才查找一次, 而这棵树的叶子数据1 据一年才查找一次 , 而这棵树的叶子数据 1 秒钟需要 查找1 查找1W次(考虑数据的查找概率)。这种折半查找的 考虑数据的查找概率) 效率又不行了? 效率又不行了?
5.A*算法
f‘(n)是估价函数 , g’(n)是起点到终点的最短路径 f‘(n) 是估价函数, g’(n) 是起点到终点的最短路径 值 , h‘(n) 是 n 到目标的最短路径的启发值 。 由于 h‘(n)是 到目标的最短路径的启发值。 这个f’(n) 其实是无法预先知道的, 这个 f’(n)其实是无法预先知道的 , 所以我们用前 面 的 估 价 函 数 f(n) 做 近 似 。 g(n) 代 替 g‘(n) , 但 g(n)>=g’(n)才可 ( 大多数情况下都是满足的, g(n)>=g’(n) 才可( 大多数情况下都是满足的 , 可 以不用考虑) h(n)代替 h‘(n), h(n)<=h’(n)才 以不用考虑 ) , h(n) 代替h‘(n) , 但 h(n)<=h’(n) 才 可(这一点特别的重要)。 这一点特别的重要) 可以证明应用这样的估价函数是可以找到最短路 径的,也就是可采纳的。 径的,也就是可采纳的。我们说应用这种估价函 数的最好优先算法就是A*算法。 数的最好优先算法就是A*算法。
5.A*算法
启发式搜索其实有很多的算法, 启发式搜索其实有很多的算法,比 如:局部择优搜索法、 如:局部择优搜索法、最好优先搜 索法等等。 当然 A*也是 。 索法等等 。 当然A* 也是。 这些算 法都使用了启发函数, 法都使用了启发函数,但在具体的 选取最佳搜索节点时的策略不同。 选取最佳搜索节点时的策略不同。
5.A*算法
象局部择优搜索法, 象局部择优搜索法,就是在搜索的过程 中选取“最佳节点” 中选取“最佳节点”后舍弃其他的兄弟 节点,父亲节点,而一直得搜索下去。 节点,父亲节点,而一直得搜索下去。
这种搜索的结果很明显, 这种搜索的结果很明显,由于舍弃了其 他的节点, 他的节点,可能也把最好的节点都舍弃 了,因为求解的最佳节点只是在该阶段 的最佳并不一定是全局的最佳。 的最佳并不一定是全局的最佳。
5.A*算法
最好优先就聪明多了,他在搜索时, 最好优先就聪明多了,他在搜索时,便没有 舍弃节点(除非该节点是死节点) 舍弃节点(除非该节点是死节点),在每一 步的估价中都把当前的节点和以前的节点的 估价值比较得到一个“最佳的节点” 估价值比较得到一个“最佳的节点”。这样 可以有效的防止“最佳节点”的丢失。 可以有效的防止“最佳节点”的丢失。那么 A*算法又是一种什么样的算法呢 ? 其实 A* A* 算法又是一种什么样的算法呢?
5.A*算法
关于h(n)启发函数的信息性: 关于h(n)启发函数的信息性:
h(n)的信息性通俗点说其实就是在估计一个节点的 h(n) 的信息性通俗点说其实就是在估计一个节点的 值时的约束条件; 如果信息越多或约束条件越多则排除的节点就越多, 如果信息越多或约束条件越多则排除的节点就越多, 估价函数越好或说这个算法越好。 估价函数越好或说这个算法越好。这就是为什么广 度优先算法的那么臭的原因了,谁叫它的h(n)=0 度优先算法的那么臭的原因了,谁叫它的h(n)=0, 一点启发信息都没有 但在有的算法中,由于算法本身的特点, h(n)的信 但在有的算法中,由于算法本身的特点, h(n)的信 息很多,它的计算量也很大,耗费的时间就很多。 息很多,它的计算量也很大,耗费的时间就很多。 就应该适当的减小h(n) 的信息,即减小约束条件。 就应该适当的减小 h(n)的信息,即减小约束条件。 但算法的准确性就差了,这里就有一个平衡的问题。 但算法的准确性就差了,这里就有一个平衡的问题。
5.A*算法
常用的状态空间搜索有深度优先和广度 优先。 优先。 有一个很大的缺陷就是他们都是在一个 给定的状态空间中穷举。 给定的状态空间中穷举。这在状态空间 不大的情况下是很合适的算法, 不大的情况下是很合适的算法,可是当 状态空间十分大, 状态空间十分大,且不预测的情况下就 不可取了。他的效率实在太低, 不可取了。他的效率实在太低,甚至不 可完成。在这里就要用到启发式搜索了。 可完成。在这里就要用到启发式搜索了。
6.搜索树
查找有两大类:静态查找和动态查找。 静态查找有如下几种常用: 1.顺序查找:大家都知道,最简单的 查找方法就是顺序查找 (一个接一个 得查下去)。这种线性结构的查找效 率是最低的,时间复杂度在O(N)数量 率是最低的,时间复杂度在O(N)数量 级,最坏的情况莫过于所有数据都找 遍了,还是没找到。(疑惑:难道真 的每一个数据都必须找一次吗?)
5.A*算法
我们先看看估价是如何表示的。 启发中的估价是用估价函数表示的,如: f(n) = g(n) + h(n) 其中f(n)是节点n的估价函数,g(n)实在状态空间中从 其中f(n)是节点n的估价函数,g(n)实在状态空间中从 初始节点到n节点的实际代价,h(n)是从n 初始节点到n节点的实际代价,h(n)是从n到目标节点 最佳路径的估计代价。在这里主要是h(n)体现了搜索 最佳路径的估计代价。在这里主要是h(n)体现了搜索 的启发信息,因为g(n)是已知的。如果说详细点,g(n) 的启发信息,因为g(n)是已知的。如果说详细点,g(n) 代表了搜索的广度的优先趋势。但是当h(n)>>g(n)时, 代表了搜索的广度的优先趋势。但是当h(n)>>g(n)时, 可以省略g(n),而提高效率。 可以省略g(n),而提高效率。
1.枚举算法
枚举法是最简单的搜索策略,由于它只是 将可能取到的值一一列举,所以运算量很 大,这是枚举法最大的弱点。 在有可能的情况下,采取一定措施进行优 化:如:
利用加强约束条件改进的枚举算法 利用数学分析改进的枚举算法
2.深度优先遍历
如算法名称那样,深度优先搜索所遵循的搜索策 略是尽可能“深”地搜索树。 在深度优先搜索中,对于当前发现的结点,如果 它还存在以此结点为起点而未探测到的边,就沿 此边继续搜索下去,若当结点的所有边都己被探 寻过,将回溯到当前结点的父结点,继续上述的 搜索过程直到所有结点都被探寻为止。 它所实施的数据前提是一个状态树。
算法也是一种最好优先的算法。只不过要加
上一些约束条件罢了。 上一些约束条件罢了。
5.A*算法
先下个定义,如果一个估价函数可 以找出最短的路径,我们称之为可 采纳性。A*算法是一个可采纳的 采纳性。A*算法是一个可采纳的 最好优先算法。A*算法的估价函 最好优先算法。A*算法的估价函 数可表示为: f'(n) = g'(n) + h'(n)
5.A*算法
其实广度优先算法就是A* 算法的 其实广度优先算法就是 A*算法的 特例。其中g(n)是节点所在的层数, 特例。其中g(n)是节点所在的层数, h(n)=0 这种 h(n)肯定小于 h'(n), h(n)=0 , 这种h(n) 肯定小于h'(n) , 所以由前述可知广度优先算法是一 种可采纳的。实际也是。 种可采纳的。实际也是。当然它是 一种最臭的A*算法。 一种最臭的A*算法。
3. 广 度 优 先 遍 历
3. 广 度 优 先 遍 历
4.双向广度优先
广度优先搜索遵循从初始结点开始一层层扩展直到 找到目标结点的搜索规则, 找到目标结点的搜索规则,它只能较好地解决状态 不是太多的情况,承受力很有限。 不是太多的情况,承受力很有限。如果扩展结点较 多,而目标结点又处在较深层,采用前文叙述的广 而目标结点又处在较深层, 度搜索解题,搜索量巨大是可想而知的, 度搜索解题,搜索量巨大是可想而知的,往往就会 出现内存空间不够用的情况。双向搜索和A 出现内存空间不够用的情况。双向搜索和A算法对 广度优先的搜索方式进行了改良或改造, 广度优先的搜索方式进行了改良或改造,加入了一 定的“智能因素” 使搜索能尽快接近目标结点, 定的“智能因素”,使搜索能尽快接近目标结点, 减少了在空间和时间上的复杂度。 减少了在空间和时间上的复杂度。
6.搜索树
在计算机许多应用领域中,查找操作都是十 分重要的研究技术。查找效率的好坏直接影 响应用软件的性能。比如说: ⑴全文检索技术中对文本建立索引之后,对 索引的查找效率将决定搜索引擎的质量。 ⑵mysql数据库的索引就是B+树结构,查找 mysql数据库的索引就是B+树结构,查找 效率极高。 ⑶ Windows OS的文件系统结构也是采用 OS的文件系统结构也是采用 B+树进行存储的。 B+树进行存储的。
5.A*算法
启发式搜索就是在状态空间中的搜索对每
一个搜索的位置进行评估, 一个搜索的位置进行评估,得到最好的位 置,再从这个位置进行搜索直到目标。这
样可以省略大量无畏的搜索路径, 样可以省略大量无畏的搜索路径, 提到了 效率。 在启发式搜索中, 效率。 在启发式搜索中, 对位置的估价是 十分重要的。 十分重要的。采用了不同的估价可以有不 同的效果。我们先看看估价是如何表示的 。 同的效果。我们先看看估价是如何表示的。
相关文档
最新文档