首页 > 其他 > 详细

优雅实现深度遍历DFS与广度遍历BFS

时间:2020-10-19 21:42:18      阅读:34      评论:0      收藏:0      [点我收藏+]


深度遍历DFS&广度遍历BFS


定义

深度遍历DFS:

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止。

广度遍历BFS:

广度遍历是最简便的图的搜索算法之一,以广度优先,横向逐层地遍历,直到没有下一层为止。

实现方式

数据源:
搜索其中的name值

    const data = [
        {
            name: ‘a‘,
            children: [
                { name: ‘b‘, children: [{ name: ‘e‘ }] },
                { name: ‘c‘, children: [{ name: ‘f‘ }] },
                { name: ‘d‘, children: [{ name: ‘g‘ }] },
            ],
        },
        {
            name: ‘a2‘,
            children: [
                { name: ‘b2‘, children: [{ name: ‘e2‘ }] },
                { name: ‘c2‘, children: [{ name: ‘f2‘ }] },
                { name: ‘d2‘, children: [{ name: ‘g2‘ }] },
            ],
        }
    ]

深度遍历DFS

 	/*
    * 深度遍历
    * 思路:遍历第一层,得到每一个item,获取其中的name,再对item下一级的children进行递归
    * */
    function dfs(arr) {
        let result = [];
        for(let key in arr) {
            let item = arr[key];
            result.push(item.name);
            if(item.children) result.push(...dfs(item.children))
        }
        return result;
    }

广度遍历BFS

    /*
    *   思路:递归方式
    * 	因为是按层进行递归,所以遇到children并不能马上进行,应该先定义数组收集好下层的children,当前层遍历完后再递归下一层
    * 	例如:在遍历[a, a2]时,收集数组的下层[b,c,d,b2,c2,d2],依次类推
    * */
    function bfs(arr) {
        let result= [];
        let cacheLevel = []; // 记录下层待遍历的数组
        for(let key in arr) {
            let item = arr[key];
            result.push(item.name)
            if(item.children) cacheLevel.push(...item.children);
        }
        if(cacheLevel.length > 0) result.push(...bfs(cacheLevel));
        return result;
    }

广度遍历BFS【队列思维实现-优】

    /*
    * 队列思维实现:队列方式
    * 思路:创建一个队列,不断读取第一个队列,发现下层有要遍历的则添加进队列中,然后每遍历完自身就去掉,知道队列中把所有的都遍历完。
    * */
    function queueBfs(arr) {
        let result = [];
        let queue = arr;
        while(queue.length > 0) {
            let item  = queue[0];
            result.push(item.name);
            if(item.children) queue.push(...item.children);
            queue.shift();
        }
        return result
    }
  • 在测试性能的时候:queueBfs > bfs > dfs。

  • 并且queueBfs性能远高于bfs。

简单才是真爱

优雅实现深度遍历DFS与广度遍历BFS

原文:https://www.cnblogs.com/bigname/p/13841900.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!