[十大算法JavaScript的实现] 七、BFS广度优先搜索

目录

一、概念

二、类比

三、实现

四、结果


一、概念

图搜索算法,设置一个顶点,寻找所有子节点,如果未找到目标,则以所有子节点的子节点作为搜索对象,依次类推,直到没有子节点可搜索,则搜索完成。

二、类比

对比DFS,BFS是横向扩展的,每次只会扩展一个层级。类似一个人的关系网。

三、实现

js

 // 员工重要性
 // 元素含义:[[员工id],[员工重要程度],[员工直系下属(数组)]]
 let input = [
    [1, 14, [2, 3]],
    [2, 10, [4, 5]], [3, 11, [6, 7, 8, 9]],
    [4, 7, [10, 11]], [5, 5], [6, 7], [7, 8], [8, 6, [12]], [9, 8],
    [10, 1], [11, 2], [12, 4]
  ]
 //转Map
 let mapAllMember = ((input) => {
  let map = {};
  for (let item of input) {
   map[item[0]] = { val: item[1], sub: item[2] }
  }
  return map;
 })(input);
 // 计算总重要程度
 let findSumImportance = (id) => {
  let imp = mapAllMember[id].val;
  let sub = [];
  let ids = [id];
  while ((sub = fundSubordinate(ids)).length) {
   for (let id of sub) {
    imp += mapAllMember[id].val;
   }
   ids = sub;
  }
  return imp;
 }
 /**
  * ids数组 寻找所有成员直系下属ids
  * @param {[type]} ids [被寻找成员id数组]
  * @return {[type]}   [所有直系下属id数组]
  */
 let fundSubordinate = (ids) => {
  let sub = [];
  for (let id of ids) {
   if (mapAllMember[id].sub) {
    sub = sub.concat(mapAllMember[id].sub);
   }
  }
  return sub;
 }
 let id = Math.floor(Math.random() * 12) + 1;
 let sumImportance = findSumImportance(id);
 console.log('ID:' + id);
 console.log('总重要程度为:' + sumImportance);

四、结果

image.png

你可能感兴趣的:(数据结构与算法)