zoukankan      html  css  js  c++  java
  • 关于爆搜

    关于爆搜

    (这还用说,讲者太菜了)

    ​ 爆搜通常是没有思路时一个 优秀 玄学的解题方法,但同样是搜索,我们所的分数却相差甚远,即搜索的优化问题;

    前言

    ​ 这是很基础的东西,这里只作为回顾.

    ​ 讲着实力不足,请不要D讲者;

    BFS

    ​ BFS,广度优先搜索,用于逐层拓展的工具,可以有效地通过比较同一层之间的结果进行有效地减枝,而相比之下DFS的减枝就比较玄学,故能用BFS时,BFS的时间复杂度一般比DFS要低很多;

    ​ BFS也是SPFA的实现基础 虽然SPFA已经死了 .

    ​ BFS有双重BFS,常用于两个物品有关联地移动.

    ​ BFS还包括双向BFS,通常用于两个物品移动的相遇问题.

    例题就不再找了,自行搜索吧;

    DFS

    ​ DFS,深度优先搜索,用于寻找单个情况,有着很玄学的时间复杂度.

    ​ DFS常用于图的遍历和搜索情况,但是在搜索每种情况时,DFS的搜索树会成指数型增长,即爆炸性增长,那么减枝是极其重要的;

    ​ 此时解决这种情况的一种方法是迭代加深,限制深度,多次搜索.虽然看起来极其浪费,但是当答案所在层很浅时,这种算法的时间复杂度比起DFS的搜索树的爆炸性增长,极度优秀;

    ​ 当然迭代加深是有许多限制,我们常用的还是减枝,常用的减枝有贪心减枝,显然错误减枝,以及一些玄学优化;

    ​ 更加高级的还有IDA*优化,最优解减枝;

    ​ 为了增加一些体验感受(讲不动了),我们加入一些水题;

    ​ [NOIP2004]虫食算

    给你 (n) 个字母构成的的 (3)(n) 列的 (n) 进制加法式子,请求出各个字母的一个解.

    ​ 这是我在搜索入门时写的题目,然后.....炸了.于是我就放弃了,现在再来看这道题,其实还好(还是那么毒瘤)

    ​ 正解是什么逆矩阵,我不会啊QWQ(交给数论组吧OAO)

    ​ 那么考虑爆搜,我们暴力枚举每个字母的值,然后求出第 (3) 行的值,检验即可;

    ​ 但是复杂度会爆炸,怎么办?

    ​ 优化1: 暴力检验第三行(废话)

    ​ 优化2:将矩阵扫一遍,检查是否合法;

    ​ 优化3:检验第 (1) 列,查看是否符合性质;

    ​ 这样应该就可以过了;

    ​ 除了以上这些优化,DFS优化方式还有更加玄学的随机搜索,期望得分较高,实际得分玄学;

  • 相关阅读:
    modCount到底是干什么的呢
    Java 8 中的 Streams API 详解
    2017年3月16工作日志【mysql更改字段参数、java8 map()调用方法示例】
    jquery选择器之获取父级元素、同级元素、子元素
    Java8必知必会
    javascript es6 Promise 异步同步的写法(史上最简单的教程了)
    sublime插件开发教程4
    sublime插件开发教程3
    sublime插件开发教程2
    sublime插件开发教程1
  • 原文地址:https://www.cnblogs.com/waterflower/p/11842572.html
Copyright © 2011-2022 走看看