BFS提高效率的一点建议
2014-03-25 21:53
176 查看
BFS有两种常见的形式:
形式1:
把初始点加入队列;
while (队列非空) {
取出队头;
操作取出的点;
寻找周围符合条件的点加入队列;
}
形式2:
操作初始点
把初始点加入队列;
while (队列非空) {
取出队头;
寻找周围符合条件的点,操作找到的点,然后加入队列;
}
这两种形式的差别就是新找到的点先插入队列还是先操作,看似没什么差别,其实有的时候效率差别非常大;
举个栗子:
每次操作为对节点赋值为‘Y’
如果输入20 x 20的字符矩阵,则代码1的运行时间为0.003s, 代码2的运行时间为1.126s,是不是感到大吃一惊???
原因在哪里呢?
如果输出中间过程的队列长度就可以发现代码2的队列长度非常大,因为未处理就加入队列,以后被重复加入的几率很大,大量点被重复的加入队列,导致冗余,造成不必要的开张,效率低下。
而先处理再加入队列,因此节点已经改变,则不会再被加入队列,因此队列内不会出现重复。
因此,最好使用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的第一种形式。
相关文章推荐
- 提高SQL执行效率的几点建议:
- 提高PHP编程效率的几点建议
- 提高程序并行效率的一点经验
- 提高编程效率的几点建议
- Oracle提高sql执行效率的心得建议
- 提高效率 十条关于Gmail附件的超级建议
- 提高SQL执行效率的几点建议
- 提高PHP编程效率的一些建议
- SQL Server海量数据如何提高查询效率几点建议
- [摘]提高SQL语句查询效率的若干建议
- 提高SQL语句查询效率若干建议
- 提高SQL执行效率的几点建议
- 提高SQL执行效率的几点建议
- 提高PHP编程效率的一些建议
- 提高 Vim 和 Shell 效率的 9 个建议
- Linux使用zsh提高效率的5条建议
- 提高SQL执行效率的几点建议
- 待看 六个小建议充分利用时间 提高预习效率
- 极大提高Web开发效率的8个工具和建议(含教程)
- 提高PHP编程效率的几点建议