当前位置: 首页 > news >正文

wordpress网站建设西安 做网站

wordpress网站建设,西安 做网站,wordpress 并发量,长沙com建站网站设计第五十二章 BFS进阶(二)——双向广搜一、双向广搜1、优越之处2、实现逻辑3、复杂度分析二、例题1、问题2、分析3、代码一、双向广搜 1、优越之处 双向广搜是指我们从终点和起点同时开始搜索,当二者到达同一个中间状态的时候,即相…

第五十二章 BFS进阶(二)——双向广搜

  • 一、双向广搜
    • 1、优越之处
    • 2、实现逻辑
    • 3、复杂度分析
  • 二、例题
    • 1、问题
    • 2、分析
    • 3、代码

一、双向广搜

1、优越之处

双向广搜是指我们从终点和起点同时开始搜索,当二者到达同一个中间状态的时候,即相遇。

那么这么搜有什么好处呢?

我们知道,在很多题目中,我们使用BFS的时间复杂度是指数级别的。

也就是说,如果讲BFS的进行次数画成一个函数的话,就会画成下面这个图。

在这里插入图片描述

如果我们采取从两端出发,到中间某点相遇的做法。

那么示意图可以画成下面的样子:
在这里插入图片描述

可能原来我们需要进行A次搜索,但是双向广搜的话,我们就只需要进行B次搜索。(上图仅仅表示一个大概意思,目的仅仅为了突出双向广搜进行了很大的优化,请勿追究细节)

除了上面这种大致的表示方法外,我们还可以画成一个搜索树的形式来看。

在这里插入图片描述
红色绿色线交叉的部分组成的菱形是双向广搜过程中所需搜索的状态数量。

上面的两个图仅仅是感性的分析了一下,双向广搜的优越之处。

我们还需要量化计算一下,到底优化了多少,具体的时间复杂度是多少,在分析复杂度之前,我们需要先看一下双向广搜大体的实现逻辑。

2、实现逻辑

我们创建两个队列。

一个队列从起点开始广搜,一个队列从终点开始广搜。

而在BFS中,我们的执行次数和队列中的元素是相关的。我们队列中的元素越多,BFS需要扩展的就越多。所以我们可以通过队列中的元素个数来代表一个BFS扩展时的复杂程度。

因此,我们可以比较两个BFS的队列中的元素,谁队列中元素少,就对哪个BFS进行拓展。

3、复杂度分析

根据上面的算法实现,我们可以知道,基本上就是从终点开始的BFS和从起点开始的BFS轮流进行。

我们可以认为二者进行的次数是一样的。

假设二者一共扩展了KKK次,那么各自可以认为进行了k/2k/2k/2次。

这里的拓展是只刚才搜索树中的。假设每次扩展是多两个状态入队,那么总共的状态就是1+21+22....+2k/2−11 + 2^1 + 2^2 ....+2^{k/2-1}1+21+22....+2k/21,求和以后约等于2k/22^{k/2}2k/2,那么两个BFS加起来就是2k/2+12^{k/2+1}2k/2+1

如果单向广搜的话,按照刚才的求和公式,对kkk层的状态求和,大概是2k2^{k}2k

那么我们就发现优化了大约2k/22^{k/2}2k/2倍。

二、例题

1、问题

在这里插入图片描述

2、分析

过程很简单,就是从起点开始枚举每一个可能的变化,直到最后变成了B。

由于我们已经知道了终点过程,所以可以同时从B到A开始变化。一直到二者中间状态重合。

3、代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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;
}void solve()
{cin >> A >> B;while(cin >> a[n] >> b[n])n ++;int t = bfs();if(t == -1)cout << "NO ANSWER!\n";else cout << t << "\n";
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();
}
http://www.yidumall.com/news/54035.html

相关文章:

  • 可口可乐公司建设网站的目的是什么意思重庆关键词快速排名
  • 做商城网站建设哪家好自己怎样推广呢
  • 怎么自己改自己做的网站的图片在线培训平台有哪些
  • 株洲网站seo优化价格初学者做电商怎么入手
  • 去哪里学做网站app关键词排名网络推广
  • 怎样做好网络推广呀搜索引擎seo如何优化
  • 江门做网站网络公司推广方案
  • 网上营销网站官方百度平台
  • 网站的前端开发怎么建立网站卖东西
  • 商丘峰少seo来宾seo
  • 南京公司网站建设江西优化中心
  • 在线视频播放网站怎么做的sem竞价教程
  • 网站的三大因素怎样在网上做推广
  • 网站建设lnmp谷歌seo技巧
  • good work wordpress网站快速优化排名官网
  • 怎么做qq分享网站百度竞价个人开户
  • 静安区品牌网站建设短视频seo询盘获客系统
  • 如何在局域网中做网站天津seo公司
  • asp网站建设参考文献seo是什么东西
  • 做网站的难点简述如何优化网站的方法
  • 做h5网站用什么电脑版百度
  • 网站的作用和意义德芙巧克力的软文500字
  • 一个服务器可以做多个网站吗综合型b2b电子商务平台网站
  • 网站建设如何避免陷入模仿误区有效的网络推广
  • 新手做市场分析的网站媒体发稿公司
  • 日照做网站的公司近期国内外重大新闻10条
  • 怎样在凡科免费做网站淘宝seo搜索引擎优化
  • wordpress历史版本数据库湖北百度seo
  • 网站如何诊断web3域名注册
  • wordpress怎么不调用文字内容seo是什么意思?