程序设计II_搜索.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用深搜解决本题不好,如用递归实现,不作特殊处理的话,很容易就导致递归层数太多而栈溢出 可以不写递归,自己用大数组实现一个栈。这可以避免栈溢出。但是可能导致输出结果的步数太多(几万步),这样交到POJ上会 Output limit exceeded 如果运气很坏,也可能数组会不够用 用深搜解决八数码问题 广搜与深搜的比较 广搜一般用于状态表示比较简单、求最优策略的问题 需要保存所有扩展出的状态,占用的空间大 每次扩展出结点时所走过的路径均是最短路 深搜几乎可以用于任何问题 只需要保存从起始状态到当前状态路径上的结点 根据题目要求凭借自己的经验和对两个搜索的熟练程度做出选择 影响搜索效率的因素 影响搜索效率的因素 搜索对象(枚举什么) 搜索顺序(先枚举什么,后枚举什么) 剪枝(及早判断出不符合要求的情况) 程序设计实习2007 * 程序设计实习2007 * 程序设计II 搜 索 内容提要 枚举 搜索 广度优先搜索 深度优先搜索 影响搜索效率的因素 POJ 1011 木棍问题 枚举 逐一判断所有可能的方案是否是问题的解 例1:求出A-I这九个字母对应的数字(1-9),使得下式成立(一一对应 ) ABCD × E FGHI 枚举 解法: 枚举ABCDE的值,计算乘积,判断是否符合要求。 ABCD × E FGHI 搜索 搜索:高级枚举 有顺序有策略地枚举状态空间中的结点,寻找问题的解 …… 例题:POJ1077八数码问题 1 2 3 4 5 6 7 8 8 2 3 1 4 6 5 7 例题:POJ1077八数码问题 状态空间 8 2 3 4 1 6 5 7 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 8 2 4 1 3 5 7 6 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 广度优先搜索 广度优先搜索 优先扩展浅层结点,逐渐深入 第一层 第二层 第三层 8 2 3 4 1 6 5 7 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 8 2 4 1 3 5 7 6 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 广度优先搜索 广度优先搜索 用队列保存待扩展的结点,从队首队取出结点,扩展出的新结点放入队尾,直到找到目标结点(问题的解) 8 2 3 4 1 6 5 7 8 2 3 4 1 5 7 6 8 2 4 1 3 5 7 6 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 广度优先搜索 广度优先搜索的代码框架 BFS() { 初始化队列 while(队列不为空且未找到目标结点) { 取队首结点扩展,并将扩展出的结点放入队尾 必要时要记住每个结点的父结点 } } 深度优先搜索 深度优先搜索 优先深入遍历靠前的结点 8 2 3 4 1 6 5 7 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 0 7 8 2 4 1 3 5 7 6 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 深度优先搜索 深度优先搜索 可以用栈实现,在栈中保存从起始结点到当前结点的路径上的所有结点 一般用递归实现 深度优先搜索 深度优先搜索的非递归框架 DFS() { 初始化栈 while(栈不为空 且 未找到目标结点) { 取栈顶结点扩展,扩展出的结点放回栈顶 } …… } 深度优先搜索 深度优先搜索的递归框架 在深度优先搜索中,状态空间的图结构并不一定需要显式的存下来。 type node; void DFS(int depth){ for(node的每一个可行变化){ 改变node DFS(depth + 1) 恢复node } } 此种做法需要一个全局数组array来存放每个走过的node,array[depth]就是进入DFS函数时需要扩展的节点 判重 判重 新扩展出的结点如果和以前扩展出的结点相同,则则个新节点就不必再考虑 如何判重? 重复? 8 2 3 4 1 6 5 7 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 0 7 8 2 4 1 3 5 7 6 8 2 3 4 1 5 7 6 8 2 3 4 1 6 5 7 判重 需要考虑的问题 状态数目巨大,如何存储? 怎样才能较快的找到重复结点? 时间 空间 判重 合理编码,减小存储代价 不同的编码方式所需要的存储空间会有较大差别 8 2 3 4 1 6 5 7 方案一:每个节点对应于一个九进制数,则4个字节就能表示一个节点。 判重需要一个标志位序列,每个状态对应于标志位序列中的1位,标志位为0表示该状态尚未扩展,为1则说明已经扩展过了 标志位序列可以用字符数组存放。数组的每个元素存放8个状

文档评论(0)

benzei244572 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档