BFS提高效率的一点建议
BFS有两种常见的形式:
形式1:
把初始点加入队列;
while (队列非空) {
取出队头;
操作取出的点;
寻找周围符合条件的点加入队列;
}
形式2:
操作初始点
把初始点加入队列;
while (队列非空) {
取出队头;
寻找周围符合条件的点,操作找到的点,然后加入队列;
}
这两种形式的差别就是新找到的点先插入队列还是先操作,看似没什么差别,其实有的时候效率差别非常大;
举个栗子:
//BFS示例1:先操作后插入队列
void bfs(int x, int y, int n, int m, vector<vector<char>> &board) {
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
static queue<pair<int, int> > Q;
Q.push(make_pair(x, y));
board[x][y] = 'Y';
while (!Q.empty()) {
auto e = Q.front();
Q.pop();
for (int i = 0; i < 4; ++i) {
if (check(e.first + dx[i], e.second + dy[i], n, m) && board[e.first + dx[i]][e.second + dy[i]] == 'O') {
board[e.first + dx[i]][e.second + dy[i]] = 'Y';
Q.push(make_pair(e.first + dx[i], e.second + dy[i]));
}
}
}
}
//BFS示例2: 先插入队列后操作
void bfs(int x, int y, int n, int m, vector<vector<char>> &board) {
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
static queue<pair<int, int> > Q;
Q.push(make_pair(x, y));
while (!Q.empty()) {
auto e = Q.front();
Q.pop();
board[e.first][e.second] = 'Y';
for (int i = 0; i < 4; ++i) {
if (check(e.first + dx[i], e.second + dy[i], n, m) && board[e.first + dx[i]][e.second + dy[i]] == 'O') {
Q.push(make_pair(e.first + dx[i], e.second + dy[i]));
}
}
}
}
每次操作为对节点赋值为‘Y’
如果输入20 x 20的字符矩阵,则代码1的运行时间为0.003s, 代码2的运行时间为1.126s,是不是感到大吃一惊???
原因在哪里呢?
如果输出中间过程的队列长度就可以发现代码2的队列长度非常大,因为未处理就加入队列,以后被重复加入的几率很大,大量点被重复的加入队列,导致冗余,造成不必要的开张,效率低下。
而先处理再加入队列,因此节点已经改变,则不会再被加入队列,因此队列内不会出现重复。
因此,最好使用BFS的第一种形式。
BFS提高效率的一点建议的更多相关文章
- ArcGIS地图文档MXD效率慢的一点建议(二)
经常有用户询问,我的MXD图层比较多,而且配置好了相关的符号,但是我的服务器更换了一下,而且两个服务器的要素类名称都是一样的,我想配置一下新的数据源,而且我的这个MXD已经连接不到原来的数据源了,打开 ...
- Oracle多表连接,提高效率,性能优化 (转)
执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. ...
- 提高效率的Matlab使用方式
1.花一点时间学习一些提高效率的技巧永远是值得的: 2.总结和记录永远是必要的. Command窗口: Editor窗口: 1.Tab自动补全
- HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题
先设置4个: [csharp] webrequest.ServicePoint.Expect100Continue = false; //是否使用 Nagle 不使用 提高效率 webrequest. ...
- 计算机天才Aaron Swartz 名作 《如何提高效率》——纪念真正的“hacker"!
如何提高效率 <HOWTO: Be more productive>(如何提高效率)作者:Aaron Swartz 肯定有人跟你说过这样的话,“你有看电视的那么长时间,都可以用来写一本书了 ...
- 【端-iOS】给iOS开发入门者编码的一点建议
规范编码可以提高代码的可读性,降低维护成本.作为一个程序员,要对自己写的代码负责,虽然bug无可避免,但是写代码时最基本的编码规则还是应该遵守的,否则不是坑自己就是坑别人,因为代码肯定是要维护的. 下 ...
- 利用mock提高效率
利用mock提高效率 谈到mock,就不得不讲前后端分离.理想情况下前后端不分离,由全栈的人以product和infrastructure的维度进行开发,效率是最高的.近些年来业务的复杂度越来越高,真 ...
- 分享两个提高效率的AndroidStudio小技巧
这次分享两个 Android Studio 的小技巧,能够有效提高效率和减少犯错,尤其是在团队协作开发中. Getter 模板修改--自动处理 null 判断 格式化代码自动整理方法位置--广度 or ...
- 提高效率!15款最好的 Bug 跟踪应用程序
当涉及到开发项目时,其中比较重要的事情是它需要某种形式的错误和问题跟踪工具来发现和解决问题,否则会浪费大量的时间. 此外,你总是要标签应用来标示那些悬而未决的问题,而这种分期执行的项目进度将帮助您 ...
随机推荐
- sql这两个表和查询的组合yii通过使用数据库查询
sql两个表的组合查询 使用 join on 比如:两个表查询: select u.username, t.title from user u join task t on u.id = t.id; ...
- 微软 2018 年第一笔收购:文件存储公司 Avere Systems
微软 2018 年第一笔收购:文件存储公司 Avere Systems 2018 年 1 月 4 日, 9:47 上午 · Picturepan2 微软今天宣布收购文件存储公司 Avere Syste ...
- Crystal Report - 利用后台代码设计或实现水晶报表工具栏相关功能
水晶报表工具栏分页按钮响应事件: 水晶报表中有自带的分页功能,在设置好每页显示的记录后会自动分页,并自动记录总页数和保存当前页,在工具栏可以通过“首页”“尾页”“下一页”“上一页”和“跳页”进行页面跳 ...
- MySQL SYS CPU高的案例分析(二)
原文:MySQL SYS CPU高的案例分析(二) 后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压 ...
- Hibernate4与hibernate3有错误的版本号的主要区别所造成的不一致
Hibernate版本号修改 Hibernate4的修改较大仅仅有spring3.1以上版本号可以支持,Spring3.1取消了HibernateTemplate,由于Hibernate4的事务管理已 ...
- Robot Framework 快速入门_英文版
Copyright © Nokia Siemens Networks 2008 Licensed under the Apache License, Version 2.0 Table of Cont ...
- WPF自定义控件 使用阿里巴巴图标
原文:WPF自定义控件 使用阿里巴巴图标 上一篇介绍了 WPF自定义控件 按钮 的初步使用,在进一步介绍WPF自定义控件 按钮之前,先介绍一下如何在WPF项目中使用阿里巴巴图标,方便以后做示例. 1. ...
- WPF笔记 ( xmlns引用,Resource、Binding 前/后台加载,重新绑定) 2013.6.7更新
原文:WPF笔记 ( xmlns引用,Resource.Binding 前/后台加载,重新绑定) 2013.6.7更新 1.xmlns Mapping URI的格式是 clr-namespace:&l ...
- WPF 遍历DataTemplate(获取所有控件)
原文:WPF 遍历DataTemplate(获取所有控件) 情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件. 方法: http://b ...
- UVA - 825Walking on the Safe Side(dp)
id=19217">称号: UVA - 825Walking on the Safe Side(dp) 题目大意:给出一个n * m的矩阵.起点是1 * 1,终点是n * m.这个矩阵 ...