码迷,mamicode.com
首页 > 其他好文 > 详细

图搜索——使用DFS和BFS耗时比较

时间:2017-11-04 19:46:02      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:rand   +=   保存   src   null   push   for   str   生成   

图测试数据生成代码:

#include<bits/stdc++.h>
using namespace std;
int random(int mod) {
    return rand() % mod;
}

int main() {
    freopen("gragh2.txt", "w", stdout);
    srand(time(NULL));
    int n = 100000, m = 1 << 22;
    int a, b;
    printf("%d %d\n", n, m);
    for(int i = 0; i < m; ++i) {
        a = random(n), b = random(n);
        if(a == b && a == 0)b = 1;
        else if(a == b && a == n - 1)b = n - 2;
        else if(a == b)++b;
        printf("%d %d\n", a, b);
    }
    return 0;
}

测试代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
int n, m;
vector<int> g[MAXN];
bool vis[MAXN];
void dfs(int s) {
    vis[s] = true;
    for(int i = 0, sz = g[s].size(); i < sz; ++i) {
        int adj = g[s][i];
        if(!vis[adj])dfs(adj);
    }
}

queue<int> que;
void bfs(int s) {
    while(!que.empty())que.pop();
    vis[s] = true;
    que.push(s);
    while(!que.empty()) {
        int top = que.front();
        que.pop();
        for(int i = 0, sz = g[top].size(); i < sz; ++i) {
            int adj = g[top][i];
            if(!vis[adj]) {
                que.push(adj);
                vis[adj] = true;
            }
        }
    }
}

/**
跑dfs时,结果写到result1.txt中。
跑bfs时,结果写到result2.txt中。
*/
int main() {
    freopen("gragh2.txt", "r", stdin);
    freopen("result1.txt", "w", stdout);
    int a, b;
    while(~scanf("%d%d", &n, &m)) {
        for(int i = 0; i < m; ++i) {
            scanf("%d%d", &a, &b);
            g[a].push_back(b);
            g[b].push_back(a);
        }
        int start, endd;
        srand(time(NULL));
        for(int k = 0; k < 10; ++k) {
            int sum = 0;
            for(int i = 0; i < 100; ++i) {
                memset(vis, 0, sizeof(vis));
                start = clock();
                dfs(rand() % n);
                endd = clock();
                sum += endd - start;
            }
            printf("%d\n", sum);
        }
    }
    return 0;
}

结果比较:

技术分享

可以初步得出结论:当点的数量是10W,边数是400W+时,跑10次,每次100个随机起始点,BFS比DFS要快些。因此,搜索图时,如果两者都能用,那就选BFS,因为BFS用了更多的空间来换“递归时保存栈信息“的时间。

图搜索——使用DFS和BFS耗时比较

标签:rand   +=   保存   src   null   push   for   str   生成   

原文地址:http://www.cnblogs.com/565261641-fzh/p/7783917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!