- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[常用搜索算法
常用搜索算法面试笔试中经常会问到一些搜索算法,现在总结如下:搜索算法是利用计算机的高性能来有目的的穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分──控制结构和产生系统,而所有的算法的优化和改进主要都是通过修改其控制结构来完成的。现在主要对其控制结构进行讨论,因此对其产生系统作如下约定:Function ExpendNode(Situation:Tsituation;ExpendWayNo:Integer):TSituation;表示对给出的节点状态Sitution采用第ExpendWayNo种扩展规则进行扩展,并且返回扩展后的状态。(本文所采用的算法描述语言为类Pascal。)第一部分 基本搜索算法一、回溯算法回溯算法是所有搜索算法中最为基本的一种算法,其采用了一种“走不通就掉头”思想作为其控制结构,其相当于采用了先根遍历的方法来构造解答树,可用于找解或所有解以及最优解。具体的算法描述如下:[非递归算法]Node(节点类型)=RecordSitutation:TSituation(当前节点状态);Way-NO:Integer(已使用过的扩展规则的数目);EndList(回溯表):Array[1..Max(最大深度)] of Node;pos(当前扩展节点编号):Integer;List-0;pos-1;List[1].Situation-初始状态;While (pos0(有路可走)) and ([未达到目标]) doBeginIf pos=Max then (数据溢出,跳出主程序);List[pos].Way-NO:=List[pos].Way-No+1;If (List[pos].Way-NO=TotalExpendMethod) then (如果还有没用过的扩展规则)BeginIf (可以使用当前扩展规则) thenBegin(用第way条规则扩展当前节点)List[pos+1].Situation:=ExpendNode(List[pos].Situation,List[pos].Way-NO);List[pos+1].Way-NO:=0;pos:=pos+1;End-If;End-IfElse Beginpos:=pos-1;End-ElseEnd-While;[递归算法]Procedure BackTrack(Situation:TSituation;deepth:Integer);Var I :Integer;BeginIf deepthMax then (空间达到极限,跳出本过程);If Situation=Target then (找到目标);For I:=1 to TotalExpendMethod doBeginBackTrack(ExpendNode(Situation,I),deepth+1);End-For;End;范例:一个M*M的棋盘上某一点上有一个马,要求寻找一条从这一点出发不重复的跳完棋盘上所有的点的路线。评价:回溯算法对空间的消耗较少,当其与分枝定界法一起使用时,对于所求解在解答树中层次较深的问题有较好的效果。但应避免在后继节点可能与前继节点相同的问题中使用,以免产生循环。二、深度搜索与广度搜索深度搜索与广度搜索的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度搜索下一次扩展的是本次扩展出来的子节点中的一个,而广度搜索扩展的则是本次扩展的节点的兄弟节点。在具体实现上为了提高效率,所以采用了不同的数据结构.[广度搜索]Node(节点类型)=RecordSitutation:TSituation(当前节点状态);Level:Integer(当前节点深度);Last :Integer(父节点);EndList(节点表):Array[1..Max(最多节点数)] of Node(节点类型);open(总节点数):Integer; close(待扩展节点编号):Integer;New-S:TSituation;(新节点)List-0;open-1;close-0;List[1].Situation- 初始状态;List[1].Level:=1;List[1].Last:=0;While (close(open(未找到目标节点) doBegin close:=close+1;For I:=1 to TotalExpendMethod do(扩展一层子节点)BeginNew-S:=E
文档评论(0)