目测观看人数 \(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. GB/T 25000.51-2016 系统与软件工程、系统与软件质量要求和评价 第51部分

    中科软测认证中心(软件测评) 1.支持GB/T 25000.51的质量特性 (1)产品质量模型及特性 功能性 功能完备性 功能正确性 功能适合性 功能性的依从性 性能效率 时间特性 资源利用率 容量 ...

  2. Packed Ciphertexts in LWE-based Homomorphic Encryption:解读

    本节内容记录阅读该论文的笔记 介绍 首先,介绍了两种明文"打包"的方法:PVW和SV PVW:对应论文(PVW:A framework for efficient and comp ...

  3. Vue基础之 动态组件

    为什么会有动态组件> vue 通过组件机制 实现的页面功能的模块化处理,通常情况下 我们在vue中使用组件  就是先定义组件 然后再需要的地方 插入组件即可 但是在某些情况下 需要根据不同的需求 ...

  4. C++:最大子数组差

    最大子数组差 内存限制:128 MiB        时间限制:1000 ms 题目描述: 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B) ...

  5. 使用Rclone将Onedirve挂载到Linux本地

    1. centos挂载onedrive时, 需要安装fuse. # 安装fuse yum -y install fuse 2. 安装完fuse后使用rclone进行挂载 #创建挂载目录 mkdir - ...

  6. Docker容器编译安装Nginx

    Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...

  7. php 使用phpqrcode生成二维码并上传到OSS

    一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...

  8. ASP.NET MVC之model传值view

    控制器中,我们有时会在知道用户名的情况下,再获取相关数据 例如: public ActionResult Index()        {            UserInfo Entity_Tem ...

  9. zabbix-5.0自动发现

    1. 安装zabbix5.0 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.no ...

  10. 浪姐打分看不够?用几行Python代码模拟评委打分

    大家好鸭~我是小熊猫比赛大家都看过吧,每次是不是都对比赛成绩充满期待.特别是浪姐的打分看的简直欲罢不能- 今天就用Python来模拟评委打分,这个案例很短也很简单,很适合新手跟小白练习. 在某次十佳歌 ...