搜索方法专题.ppt

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搜索方法专题,百度网盘搜索方法,搜索引擎推广方法,搜索引擎优化方法,百度网盘搜索a片方法,搜索方法,资源方法搜索,qq飞车基址搜索方法,百度搜索方法,搜索引擎使用方法

迷宮 在迷宫中求从入口到出口的所有路径是一个经典的程序设计问题。 迷宫可用图(a)所示的方块来表示,其中每个元素或为通道(以空白方块表示),或为墙(以带阴影的方块表示)。迷宫问题要求的就是:从入口到出口的一个以空白方块构成的(无环)路径。 求解迷宫问题的简单方法是: 从入口出发,沿某一方向进行探索,若能走通,则继续向前走; 否则沿原路返回,换一方向再进行探索,直到所有可能的通路都探索到为止。 这类方法统称 回溯法。 栈又称为后进先出表(Last In First Out表,简称LIFO表)或下推表,如图所示 只允许在一端插入和删除的顺序表 允许插入和删除 的一端称为栈顶 (top),另一端称 为栈底(bottom) 特点 后进先出 (LIFO) 迷宫可用二维数组maze[m][n]来表示, 数组中元素为0的表示通道,为1的表示墙。 迷宫的入口处为maze[1][1], 出口处为maze[m-2][n-2], 它们的元素值必为0。 任意时刻在迷宫中的位置可用元素的行下标和列下标(i,j)来表示。 栈用顺序存储结构实现,栈中的元素类型DataType说明如下: typedef struct{ int x,y,d; } DataType; 最短路径 一、 Divide-Conquer 一、分治法的基本思想 分治法的基本思想 将一个规模为 n 的问题分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题相同。 对这 k 个子问题分别求解。如果子问题的规模仍然不够小,则再划分为 k 个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 二、分治法的基本步骤 分治法在每一层递归上都有三个步骤: 分解:将原问题分解为若干个规模较小,相互独 立,与原问题形式相同的子问题; 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; 合并:将各个子问题的解合并为原问题的解。 2 分治法的基本步骤 divide-and-conquer(P) { if ( | P | = n0) return(P); //出口 divide P into smaller subinstances P1,P2, ...,Pk;//分解问题 for (i=1; i=k; i++)  yi=divide-and-conquer (Pi); //递归的求解各子问题 merge(y1, ..., yk); //将各子问题的解合并为原问题的解. } 说 明 人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。 即将一个问题分成大小相等的 k 个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。 考虑排序问题 考虑排序问题 对于单独的一个元素,不需要做任何比较和移动,它已经有序了;?? 对于两个元素,进行一次比较和最多一次移动,便能将它们排序;?? 对于三个元素,三次比较,最多两次移动,便能将它们排序;?? ……?? 对于n个元素呢? 考虑排序问题 对于n个元素,恩,看上去比较复杂。?? 何不把它分成两个部分,先把两部分分别解决了,再想办法将这两部分合并起来呢??? n个元素分成两半,每半最多只有[n/2]+1个元素,当n2时,[n/2]+1n,数据的规模每次分配都会减小,而且可以预见,最终将会缩小到只剩1个或者2个元素!?? 1个或者2个元素的排序!呵呵… 快速排序 (Quick Sort) Quick Sort Quick Sort Quick Sort quick_sort void QuickSort(int a[], int low, int high) //快速排序的具体实现 { int Position; if(low high) { Position = Partition(a,low,high); QuickSort(a, low, Position-1); QuickSort(a, Position+1, high); } } 最优子结构:该问题可以分解为若干个规模较小的相同问题.(子问题与原问题相似,递归使用的

文档评论(0)

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

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

1亿VIP精品文档

相关文档