【问题标题】:Implementing a breadthFirstSearch function javascript实现一个breadthFirstSearch函数javascript
【发布时间】:2021-02-17 23:07:22
【问题描述】:

我正在尝试实现一个广度优先搜索函数,该函数接受一个图形、一个起始顶点和一个要搜索的结束顶点,并使用广度优先搜索算法定位给定的顶点。

下面是我的代码只使用 start,如果我这样做,我将如何添加 end 值:

const list = {
            'A': ['B', 'C'],
            'B': ['A', 'F', 'G'],
            'C': ['A', 'H'],
            'D': [],
            'E': ['F'],
            'F': ['B', 'E', 'H', 'I'],
            'G': ['B'],
            'H': ['C', 'F'],
            'I': ['F'],
        }
const graph = new Graph(list);
breadthFirstSearch(graph, 'A', 'I')  // true
const breadthFirstSearch = (graph, start, end) => {
    const queue = [start];
    const result = [];
    const visited = {};
    let currentVertex;
    visited[start] = true;

    while(queue.length){
        currentVertex = queue.shift();
        result.push(currentVertex);
        this.adjacencyList[currentVertex].forEach(neighbor => {
            if(!visited[neighbor]){
                visited[neighbor] = true;
                queue.push(neighbor);
            }
        });
    }
    return result;
}

【问题讨论】:

    标签: javascript graph breadth-first-search


    【解决方案1】:

    稍微调整一下您的代码(其逻辑接近正确)并遵循 BFS 上不太准确的 Wikipedia pseudo code,看看以下...

    const list = {
        'A': ['B', 'C'],
        'B': ['A', 'F', 'G'],
        'C': ['A', 'H'],
        'D': [],
        'E': ['F'],
        'F': ['B', 'E', 'H', 'I'],
        'G': ['B'],
        'H': ['C', 'F'],
        'I': ['F'],
    }
    
    function breadthFirstSearch( graph, start, end ) {
    
      const queue = [ { parent: 'Root', node: start } ];
      const visited = {};
      let v;
    
      while( queue.length ) {
        v = queue.shift();
        visited[ v.node ] = v.parent;
        if ( v.node === end ) {
          return visited;
        }
        for ( let edge of graph[ v.node ] ) {
          if( !visited[ edge ] ) {
              queue.push( { parent: v.node, node: edge } );
          }
        }
      }
      
    }
    
    let result = breadthFirstSearch( list, 'A', 'I' );
    console.log( result );

    关键的区别在于,当访问一个节点时,捕获被访问节点的父节点很重要。由于每个节点只有一个父节点,因此生成从目标返回根的路径是孩子的游戏......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      相关资源
      最近更新 更多