当前位置: 首页 > news >正文

蓝书《广搜的优化》整理

主要讲了3个新知识点:

1、双端队列BFS:应用于既有代价为1的变换、又有代价为0的变换时找最优解的广搜。

  广度优先搜索是按照层次优先的顺序进行搜索,即只有搜索完当前一层的所有节点后才会去更深的一层搜索。利用这个特性,广搜可以解一些最优化问题,按照搜索思想,第一次搜索到合理的答案时答案的层次即为最小,故为最优。由于广搜不会向上搜索,故用广搜解最优化问题时应注意:只有深层次的节点全部只能由同级节点或浅层次节点扩展而来时,即深层次节点不能产生浅层次节点时才能用广搜策略解最优化问题。

  由此可见,对于代价为0的转换会生成同级节点,应该在搜索深层次节点之前搜索、对于代价为1的转换会生成更深的节点,应在所有将会产生的同级节点全部搜索完后再搜索,而同级节点只会由同级节点和浅层次节点产生,并且浅层次节点已经搜索完毕。显然我们可以用数组模拟双端队列来实现这个策略。产生同级节点时就把他插到队头,产生更深的节点时就把他插到队尾,每次搜索时从队头取出一个元素进行处理,当取到答案时既得到最优解(为什么?因为显然在数组的队头下标之前的元素都不会比这个队头元素差)。

  打代码时要注意用数组模拟的双端队列的队头一开始应开在数组中间位置。

扩展:对于变换代价为非负的搜索都可以用堆来做,从堆头取出答案时就得到最优解(为什么用堆?因为代价为正,不为1,所以不一定每次扩展节点时都正好扩展下一层的节点,这时用普通队列的话有可能在还没有把同级节点都搜完的情况下就搜索到了更深层次的节点。用堆保证每次搜索的节点都是当前深度最浅的节点,因为代价为正,故不会由深节点产生浅节点)。

2、HASH判重:

  广搜比普通深搜快的主要原因之一就是重复的情况大部分被很好地避免了。当问题的状态很复杂、不方便直接存下来留以判重时可用HASH的思想,将复杂的东西通过HASH函数化为有时甚至可以作为下标的哈希值,来避免大量重复的情况。(map表示不服)

3、双向宽度优先搜索:
  广搜的过程形象地看就是一个对图进行的一个层次优先遍历。形象理解一下,广搜找解的过程就是让由已经搜到的点形象组成的“三角形”(当然也可看成其他形状啦,看个人喜好(滑稽))不断在底部增长增高,终于使三角形覆盖到答案节点的过程。

 

而这个三角形的面积就决定了广搜的复杂度。由几何学发现因为深度一样,所以若从起始节点和答案节点分别引出三角形,当他们顶点对的底边相交时底边上的高的和是等于深度的,而此时两图形的面积确比一开始的情况小很多,即复杂度低很多,所以用双向宽度搜索的办法有时也可以有效降低广搜的复杂度。(仿佛看见了十向宽度搜索的影子)

 

  对于n向宽度搜索,只要建n个队列、做n个相应的判重工作,搜到一个节点时看看是否与从目标节点引出的“三角形”重叠(即已经从目标节点来搜过了)。每次从当前代扩展节点数(队列长度)最小的那个队列取出队头进行扩展(为了更加降低复杂度)并将新节点放到那个队列的队尾。其他部分按照普通广搜做就好啦。

 

最后再提醒一下:练习不能少呢,一些题目中独特的搜索顺序或一些奇异的状态也是让人眼前一亮啊。

 

 

 

转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/11202814.html

相关文章:

  • 树上染色+可怜与超市(树状DP)
  • MySQL修改最大连接数的两个方法,偏爱第一种
  • Spring Boot
  • 开放封闭原则 Open-Closed Principle(OCP)
  • 迅为iMX6Q开发板设备树内核-注册驱动例程介绍
  • spark-phoenix
  • PMP(第六版)中的控制账户、规划包、工作包
  • elastic stack安装运行(docker)
  • 排序算法整理
  • ArrayList 源码分析 基于jdk1.8:
  • ConcurrentHashMap 源码分析,基于JDK1.8
  • CopyOnWriteArrayList 源码分析 基于jdk1.8
  • CopyOnWriteArraySet 源码分析
  • CountDownLatch 源码分析
  • HashMap 源码分析 基于jdk1.8分析
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [case10]使用RSQL实现端到端的动态查询
  • 0基础学习移动端适配
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IP路由与转发
  • nodejs:开发并发布一个nodejs包
  • Python爬虫--- 1.3 BS4库的解析器
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SQLServer之创建数据库快照
  • Transformer-XL: Unleashing the Potential of Attention Models
  • v-if和v-for连用出现的问题
  • 成为一名优秀的Developer的书单
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 跳前端坑前,先看看这个!!
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序测试方案初探
  • 白色的风信子
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • UI设计初学者应该如何入门?
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (02)Hive SQL编译成MapReduce任务的过程
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C++17) optional的使用
  • (c语言)strcpy函数用法
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (已解决)什么是vue导航守卫
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中什么样的类是可使用 await 异步等待的?