浅谈Meet in the middle——MITM

目测观看人数 0+0+0=0


Meetinthemiddle(简称 MITM),顾名思义就是在中间相遇。

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

时间复杂度可如下分析:

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

以下提供两种做法:

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

这种算法吧,对于 k(n)=n2 时,朴素算法为 n2MITM(n2)2=n24,优化了 14 复杂度。线性的优化,在数据大时效果明显。但是如果 k(n)=2n,那么朴素算法为 2nMITM2n2=2n


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

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

告诉起始点来个 MITM 双向就珂以了,175=1419857,就算是 1ms102 的老爷机跑的差不多才 0.1s

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

注意用个 hash,别 MLE

  • 例题2

原题在 codevs 众所周知 codevs

n 个砝码,现在要称一个质量为 m 的物体,请问最少需要挑出几个砝码来称?
注意一个砝码最多只能挑一次。

1n301m2311每个砝码的质量230

看起来像是背包??(

  • 解法 1:暴!力!出!奇!迹!一发爆搜切!掉!!
    记得优化awa

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

    然后就可以写出代码了:
    J1O5HH.png

  • 解法 2:用 MITM,如果后 12 发现有 =m 的就更新答案,这个稳过,不用优化。
    代码:
    J1jfTH.png

posted @   yspm  阅读(683)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示