深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止。
广度遍历是最简便的图的搜索算法之一,以广度优先,横向逐层地遍历,直到没有下一层为止。
数据源:
搜索其中的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‘ }] },
],
}
]
/*
* 深度遍历
* 思路:遍历第一层,得到每一个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;
}
/*
* 思路:递归方式
* 因为是按层进行递归,所以遇到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;
}
/*
* 队列思维实现:队列方式
* 思路:创建一个队列,不断读取第一个队列,发现下层有要遍历的则添加进队列中,然后每遍历完自身就去掉,知道队列中把所有的都遍历完。
* */
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。
简单才是真爱
原文:https://www.cnblogs.com/bigname/p/13841900.html