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



深度遍历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。

简单才是真爱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值