双向广搜——AcWing 190. 字串变换

news2024/11/18 23:44:02

双向广搜

定义

双向广搜是图搜索算法的一种变体,与传统的单向广搜不同,它同时从起点和终点(或目标状态)开始进行搜索,直到两个搜索的前沿相遇为止。这种方法可以在某些情况下显著减少搜索空间,尤其是在寻找两点间的最短路径时特别有效,因为搜索不是从一端到另一端,而是从两端向中间靠拢。

运用情况

  1. 最短路径问题:特别是在图较大或目标距离较远时,双向BFS可以显著减少搜索时间。
  2. 游戏AI:在某些游戏中,为了快速找到从角色当前位置到目标位置的最短路径,可以使用双向BFS。
  3. 网络路由:在复杂的网络环境中寻找两个节点间的最短通信路径。
  4. 拼写检查:在字典中快速查找两个单词的最短变换序列(如通过编辑距离)。

注意事项

  1. 相遇条件:需要设计一个机制来检测或标记已经探索过的节点,以避免重复探索,并能在两个搜索的前沿相遇时停止搜索。
  2. 空间复杂度:虽然双向BFS通常比单向BFS更快找到解,但它可能需要更多的内存来存储两个队列的数据。
  3. 平衡问题:为了优化效率,需要确保两个方向的搜索速度尽量均衡,避免一边搜索过快导致另一边的搜索变得冗余。
  4. 起点和终点的可达性:在开始搜索之前,应确认起点和终点都在同一个连通分量内,否则没有路径可寻。

解题思路

  1. 初始化:设置两个队列,一个用于从起点开始搜索,另一个从终点开始搜索。同时,创建两个集合或数据结构来记录各自已探索的节点。
  2. 执行广搜:在每一步中,从两个队列中各取出一层节点进行扩展。对于从起点出发的队列,向目标方向扩展;对于从终点出发的队列,则向起点方向扩展。在扩展时,检查新节点是否已经在对方的已探索集合中出现,这表明两个搜索前沿相遇,此时可以停止搜索。
  3. 相遇检测:设计一种机制来标记或检查节点是否属于对方的搜索空间。这可以通过共享一个全局已探索节点集合,或在每次扩展时检查新节点是否在对方的队列中来实现。
  4. 路径合并:一旦两个前沿相遇,可以通过追踪相遇节点的父节点,反向构造从起点到终点的完整路径。
  5. 优化:为了平衡两边的搜索速度,可以根据图的性质动态调整,比如根据每一轮扩展的节点数量调整,或者优先扩展节点数较少的一边。

AcWing 190. 字串变换

题目描述

AcWing 190. 字串变换 - AcWing

运行代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>

using namespace std;

const int N = 6;

int n;
string A, B;
string a[N], b[N];

int extend(queue<string>& q, unordered_map<string, int>&da, unordered_map<string, int>& db, 
    string a[N], string b[N])
{
    int d = da[q.front()];
    while (q.size() && da[q.front()] == d)
    {
        auto t = q.front();
        q.pop();

        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < t.size(); j ++ )
                if (t.substr(j, a[i].size()) == a[i])
                {
                    string r = t.substr(0, j) + b[i] + t.substr(j + a[i].size());
                    if (db.count(r)) return da[t] + db[r] + 1;
                    if (da.count(r)) continue;
                    da[r] = da[t] + 1;
                    q.push(r);
                }
    }

    return 11;
}

int bfs()
{
    if (A == B) return 0;
    queue<string> qa, qb;
    unordered_map<string, int> da, db;

    qa.push(A), qb.push(B);
    da[A] = db[B] = 0;

    int step = 0;
    while (qa.size() && qb.size())
    {
        int t;
        if (qa.size() < qb.size()) t = extend(qa, da, db, a, b);
        else t = extend(qb, db, da, b, a);

        if (t <= 10) return t;
        if ( ++ step == 10) return -1;
    }

    return -1;
}

int main()
{
    cin >> A >> B;
    while (cin >> a[n] >> b[n]) n ++ ;

    int t = bfs();
    if (t == -1) puts("NO ANSWER!");
    else cout << t << endl;

    return 0;
}

代码思路

  1. 初始化: 分别将A和B放入两个队列,并在对应的哈希表中记录它们到起点的距离(初始为0)。
  2. 扩展状态: 定义一个extend函数,该函数会遍历当前队列中的所有字符串,尝试应用所有规则进行扩展,并记录新状态的步数。如果在扩展过程中发现目标状态,则返回步数;否则将新状态加入队列,并在哈希表中标记其距离。
  3. 双向BFS: 同时从A和B出发进行BFS,每一轮交替扩展两个队列,直到找到交集或者达到最大步数限制。
  4. 结果判断: 如果在10步之内找到了B,返回步数;否则输出"No Answer!"。

改进思路

  • 优化内存使用: 当队列中的元素数量变得非常大时,可以考虑使用迭代器或其他方式避免存储所有中间状态,特别是在字符串长度或规则数量很大的情况下。
  • 剪枝策略: 在扩展状态时,可以添加更多的剪枝条件来减少不必要的搜索,例如当从A扩展的状态数目远大于从B扩展的状态数目时,可以优先处理从B扩展的情况,反之亦然,这样可以更快地接近交汇点。
  • 利用规则特性: 如果规则之间存在某种特定关系(如某些规则是其他规则的子串),可以通过预处理优化规则应用逻辑,减少不必要的字符串比较。
  • 并行处理: 对于大规模问题,可以考虑使用多线程或多进程并行执行BFS的扩展步骤,以加速搜索过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装PyTorch详细过程(个人过程仅供参考)

1.安装anaconda 2.创建一个虚拟环境 以上步骤默认已经完毕&#xff0c;毕竟只是记录pytorch的安装过程 3.查看个人电脑CUDA版本 winr 输入cmd 回车 输入指令 nvidia-smi 右上角为该电脑所支持的最高CUDA版本 输入命令 nvcc -V 图中即为该电脑所安装的CUDA版本 记住该版…

为什么安装了SSL证书还是不能HTTPS访问?

即便是正确安装了SSL证书&#xff0c;有时网站仍然无法通过HTTPS正常访问&#xff0c;这背后可能隐藏着多种原因。以下是一些常见的问题及解决方案&#xff0c;帮助您排查并解决这一困扰。 PC点此申请&#xff1a;SSL证书申请_https证书下载-极速签发 注册填写注册码230918&a…

文献解读-长读长测序-第十三期|《PrecisionFDA真相挑战第二版:利用短读长和长读长在难比对区域进行变异检测》

关键词&#xff1a;基因组&#xff1b;长读长测序&#xff1b;基准测试&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;PrecisionFDA Truth Challenge V2: Calling variants from short and long reads in difficult-to-map regions标题&#xff08;中文…

零基础光速入门AI绘画,SD保姆攻略

前言 大家好&#xff0c;我是AI绘画咪酱。一名AIGC狂热爱好者&#xff0c;目前正在AI绘画领域进行深入的探索。 我花了一个月时间把SD研究了一遍&#xff0c;秉持着用有趣、易懂的文字让小白也可以零基础光速使用SD&#xff08;stable diffusion&#xff09;入门AI绘画&#…

家政小程序的开发,带动市场快速发展,提高家政服务质量

当下生活水平逐渐提高&#xff0c;也增加了年轻人的工作压力&#xff0c;同时老龄化也在日益增加&#xff0c;使得大众对家政的需求日益提高&#xff0c;能力、服务质量高的家政人员能够有效提高大众的生活幸福指数。 但是&#xff0c;传统的家政服务模式存在着效率低、用户与…

Java语法系列 小白入门参考资料 逻辑控制

顺序结构 顾名思义&#xff0c;就是按着从上到下的顺序执行代码 public class Demo {public static void main(String[] args) {System.out.println("aaa");System.out.println("bbb");System.out.println("ccc");} }如果调整代码的书写顺序, …

手撕Transformer!!从每一模块原理讲解到代码实现【超详细!】

文章目录 一、位置编码位置编码的原理代码解释 二、多头注意力三、前馈神经网络&#xff08;FeedForward&#xff09;和层归一化&#xff08;NormLayer&#xff09;FeedForward 模块代码解析 NormLayer 模块代码解析 四、EncoderEncoder 类EncoderLayer 类前向传播过程 五、Dec…

喜提一等奖!白鲸开源在“创业北京”创业创新大赛海淀区选拔赛决赛表现亮眼

6月25日&#xff0c;第七届“创业北京”创业创新大赛海淀区选拔赛决赛在中关村东升国际科学园成功举办。本次活动由海淀区人力资源和社会保障局、中关村科学城管委会主办&#xff0c;以“创响新时代 共圆中国梦”为主题&#xff0c;活动现场主体赛先进制造赛道和主体赛现代服务…

网络安全在2024好入行吗?

前言 024年的今天&#xff0c;慎重进入网安行业吧&#xff0c;目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多&#xff0c;还有很多高中被挖过来的大佬。 理由很简单&#xff0c;目前来说&#xff0c;信息安全的圈子人少&#xff0c;985、211院校很多都才建立…

网站提示不安全怎么办

当您访问一个网站时&#xff0c;如果浏览器提示该网站不安全&#xff0c;这通常意味着以下几个问题之一&#xff0c;以及相应的解决办法&#xff1a; 一、未启用HTTPS协议&#xff1a; 解决方法&#xff1a;确保网站启用了HTTPS协议。这意味着您需要为您的网站部署一个有效的…

2024年最适合Python小白的零基础入门教程!

伴随着云计算、大数据、AI等技术的迅速崛起&#xff0c;市场对Python人才的需求和市场人才的匮乏&#xff0c;让长期沉默的Python语言一下子备受众人的关注&#xff0c;再加上简单易学&#xff0c;使得Python一跃成为TIOBE排行榜的第一。 准备学Python或者想学Python的小伙伴们…

1.linux操作系统CPU负载

目录 概述CPU平均负载查看平均负载结束 概述 CPU 使用率 和CPU 平均使用率。 CPU平均负载 单位时间内系统处于 [可运行状态] 和 [不可中断状态] 的平均进程数&#xff0c;就是平均活跃进程数&#xff0c;和CPU使用率并没有直接关系 可运行状态 正在使用CPU或者正等待CPU的进…

ITK-读取/写入图像

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 绪论 在本文中&#xff0c;将介绍如何使用ITK&#xff08;Insight Segmentation and Registration Toolkit&#xff09;库来读取…

【毕业一年,聊聊什么】

毕业一年&#xff0c;聊聊什么 一&#xff0c;引子 武汉&#xff0c;大雨连连&#xff0c;大雨如柱&#xff0c;大雨倾盆&#xff0c;任性的&#xff0c;傲娇的&#xff0c;一点没有想停的样子。 下雨天&#xff0c;好适合Emo啊&#xff0c;该我了&#xff0c;请允许。 二&…

Meilisearch 安装和使用教程

如今搜索功能已成为几乎所有应用不可或缺的一部分。无论是电商平台、内容管理系统&#xff0c;还是企业内部知识库&#xff0c;用户都期待能够快速、准确地找到他们需要的信息。然而&#xff0c;传统的搜索解决方案往往面临着诸多挑战&#xff1a;响应速度慢、相关性差、难以适…

分享值得推荐的6大磁力搜索器平台,亲测有效!

昨天晚上&#xff0c;隔壁出租屋的小美私信阿星&#xff0c;问哪里能下载到有趣的资源&#xff0c;比如漫画、影音、学习资料等等。 这直接问到了阿星的强项了&#xff01;其实网络上&#xff0c;高手和小白之间&#xff0c;只差一个搜索引擎。 今天阿星想和大家分享几款好用…

常用图片处理操作

静态图片文件转base64 import base64 with open(1.png, rb) as f:source f.read() base64_img base64.b64encode(source)base64转静态图片文件 imgdata base64.b64decode(base64_img)# 将图片保存为文件 with open("new.png", wb) as f:f.write(imgdata)PS:这里…

IT运维管理与运营管理的创新与实践

IT运维管理与运营管理的创新与实践 在信息化飞速发展的今天&#xff0c;IT运维管理与运营管理已成为企业保障业务连续性和提升运营效率的关键环节。随着数字化转型的深入&#xff0c;企业对IT运维管理的要求不断提高。本文结合《IT运维管理与运营管理》文档的内容&#xff0c;…

海南云亿商务咨询有限公司引领抖音电商新纪元

在数字化浪潮汹涌的今天&#xff0c;电商行业迎来了前所未有的发展机遇。作为电商服务领域的佼佼者&#xff0c;海南云亿商务咨询有限公司凭借其专业的团队和丰富的经验&#xff0c;专注于抖音电商服务&#xff0c;助力企业快速布局市场&#xff0c;实现销售增长和品牌提升。 …

基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统

一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备&#xff0c;集光、机、软件、硬件&#xff0c;智能图像处理等先进技术于一体&#xff0c;利用轮廓特征匹配&#xff0c;目标与定位&#xff0c;区域选取&#xff0c;边缘提取&#xff0c;模糊运算等算法实现人工智能高…