目测观看人数 \(0+0+0=0\)


\(\mathrm{Meet\;in\;the\;middle}\)(简称 \(\rm MITM\)),顾名思义就是在中间相遇。

可以理解为就是起点跑搜索树基本一半的状态,终点也跑搜索树基本一半的状态,最后撞到中间,一种类似双向 DFS 的东西。优化还是不错的awa,减少了差不多一半。

时间复杂度可如下分析:

设向外搜索 \(n\) 层需要的代价为 \(k(n)\)。如果不用 \(\textrm{MITM}\),那么复杂度显然是 \(\mathcal O(k(n))\)。

以下提供两种做法:

  • 方法 \(1\):由 \(\rm MITM\) 定义得,从起点搜索到一半的代价为 \(k\left(\dfrac{n}{2}\right)\),从终点搜索到一半的代价也为 \(k\left(\dfrac{n}{2}\right)\),总代价为 \(2\cdot k\left(\dfrac{n}{2}\right)\),省略常数,得时间复杂度 \(\mathcal O\left(k\left(\dfrac{n}{2}\right)\right)\)。
  • 方法 \(2\):设搜索树起点与终点为 \(A,B\) 连接 \(B\) 与搜索树左右边缘中点,再连接两个左右边缘中点,将搜索树分为四个面积相等区块,\(\rm MITM\) 仅搜索其中两个区块,得时间复杂度为 \(\mathcal O\left(k\left(\dfrac{n}{2}\right)\right)\)。

这种算法吧,对于 \(k(n)=n^2\) 时,朴素算法为 \(n^2\),\(\rm MITM\) 为 \(\left(\dfrac{n}{2}\right)^2=\dfrac{n^2}{4}\),优化了 \(\dfrac{1}{4}\) 复杂度。线性的优化,在数据大时效果明显。但是如果 \(k(n)=2^n\),那么朴素算法为 \(2^n\),\(\rm MITM\) 为 \(2^{\frac{n}{2}}=\sqrt{2^n}\)。


显然从一个节点出发进行搜索这题肯定会超时的

对于一个 \(9\) 位数,一共有 \(9\) 种可能的 \(+1\) 操作(每一个数位都可以 \(+1\)),一共有 \(8\) 种可能的交换操作,共 \(17\) 种操作。乘法原理得如果向外搜 \(10\) 层复杂度是 \(17^{10}\)使用某 Windows 常用计算小工具得 \(17^{10}=2015993900449\) 假设计算机 \(1ms\) 运行 \(10^4\) 次操作还是不能 \(1s\) 解决,显然 \(\bold{\rm TLE}\)。

告诉起始点来个 \(\rm MITM\) 双向就珂以了,\(17^5=1419857\),就算是 \(1ms\) 跑 \(10^2\) 的老爷机跑的差不多才 \(0.1s\)。

这题 \(\rm BFS\) 可能会浪费点时间还是 \(\rm DFS\) 好awa

注意用个 \(\rm hash\),别 \(\rm MLE\) 了

  • 例题2

原题在 \(\rm codevs\) 众所周知 \(\rm codevs\) \(\dots\dots\)

有 \(n\) 个砝码,现在要称一个质量为 \(m\) 的物体,请问最少需要挑出几个砝码来称?

注意一个砝码最多只能挑一次。

\(1\le n\le 30\),\(1\le m\le 2^{31}\),\(1\le \text{每个砝码的质量}\le 2^{30}\)

看起来像是背包??(

  • 解法 \(1\):暴!力!出!奇!迹!一发爆搜切!掉!!

    记得优化awa

    1. 用后缀和优化
    2. 用读优
    3. 如果当前使用的砝码数 \(\ge\) 当前最优解,\(\rm return\)(最优性剪枝);
    4. 深搜之前按从大到小排序(改变搜索顺序),\(\text{当前总重量}+\text{当前砝码重量}<m\)(最优性剪枝) ,\(\rm return\);
    5. 如果 \(\text{当前总重量}+\text{当前砝码重量}>m\) ,换下一个砝码(可行性剪枝),注意不要 \(\rm return\);

    然后就可以写出代码了:

  • 解法 \(2\):用 \(\rm MITM\),如果后 \(\dfrac{1}{2}\) 发现有 \(=m\) 的就更新答案,这个稳过,不用优化。

    代码:

浅谈Meet in the middle——MITM的更多相关文章

  1. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  2. 浅谈分词算法(3)基于字的分词方法(HMM)

    目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...

  3. Meet in the middle学习笔记

    Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...

  4. 【http协议】浅谈

    [http协议]浅谈 一. 概述 http,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. 请求与响应: 客户端发送请求,服务器端响应数 ...

  5. 浅谈分词算法基于字的分词方法(HMM)

    前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了 ...

  6. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  7. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  8. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  9. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

随机推荐

  1. 如何使用 Javascript 将图标字体渲染为图片

    前言 在软件开发中肯定要用到图标,比如下图的 Groove 音乐中就用到了许多图标.一种获取这些图标的方法是把 Groove 音乐截个图,然后熟练地开启 Photoshop,开始抠图.这种方式很逊,效 ...

  2. 论文解读(ClusterSCL)《ClusterSCL: Cluster-Aware Supervised Contrastive Learning on Graphs》

    论文信息 论文标题:ClusterSCL: Cluster-Aware Supervised Contrastive Learning on Graphs论文作者:Yanling Wang, Jing ...

  3. 组织:ISO

    国际标准化组织(ISO)是一个全球性的非政府组织,成立于1947年,总部位于瑞士日内瓦. 该组织负责绝大部分领域(包括军工.石油.船舶等垄断行业)的标准化活动,中国是其正式成员,代表中国参加的国家机构 ...

  4. 安装PostgreSQL到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:postgresql-12 硬件要求:无 安装过程 1.安装YUM-PostgreSQL存储库 ...

  5. Java线程池ThreadPoolExecutor极简教程

    ThreadPoolExecutor 简介 ThreadPoolExecutor 是 java.util.concurrent 包下的一个类,在jdk1.5版本引入,帮助开发人员管理线程并方便地执行并 ...

  6. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  7. 【雅礼集训 2017 Day2】棋盘游戏

    loj 6033 description 给一个\(n*m\)的棋盘,'.'为可通行,'#'为障碍.Alice选择一个起始点,Bob先手从该点往四个方向走一步,Alice再走,不能走走过的点,谁不能动 ...

  8. springboot 项目 运行rabbitmq(推送+消费)

    准备 先下载windos版本的mq 「rabbitmq-server-3.9.13.exe」https://www.aliyundrive.com/s/VKB63ghAJZx 点击下载 1启动rabb ...

  9. 开发工具-SSMS官方下载地址

    更新记录 2022年6月10日 完善标题. SQL Server Management Studio官方下载地址 https://docs.microsoft.com/en-us/sql/ssms/d ...

  10. 如何提高访问 GitHub 的速度

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月11日. 因为一些特殊的原因,国内访问Github的速度确实比较慢.国内访问Github经常会出现连接不上.图片加载不出来.文件无 ...