[アルゴリズム]BFS


Breadth First Searchとは?


  • BFSはDFSとともに代表的なグラフィックブラウズアルゴリズムであり,ノードと同一レベルにあるノードが最初にブラウズする方法である.

  • すなわち,先頭ノードに近いノードに先にアクセスし,遠いノードを巡回するアルゴリズムである.

  • ≪使用時|Use Time|Eas≫-2つのノード間の最短パスまたは任意のパスを検索します.
  • ex)地球上に存在するすべての友人関係をグラフで表し、AshとVanessaの間に存在する経路を検索すると
  • DFS-すべての友人関係を表示し、探索します.
  • BFS−Ashとの関係から探索を開始した.
  • BFS特性

  • もう故郷に帰って行動しません.
  • がリストにアクセスするように,アクセスしたノードのリストを作成してチェックしないと無限ループに陥る危険がある.
  • Queueを使用して、
  • でアクセスしたノードを順次保存して取り出します.
  • Prim,Dijkstraアルゴリズムと同様である.
  • BFS例



    Javaコードで実現

    package algorithm;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    
    // BFS는 visited, needVisited를 모두 queue로 구성
    public class BFS {
    	public static void main(String[] args) {
    		HashMap<String, String[]> grapgh = new HashMap<>();
    		String[][] nodeInfo = {{"B","C","D"},
    				{"A", "E", "F"},
    				{"A"},
    				{"A"},
    				{"B","G","H"},
    				{"B"},
    				{"E"},
    				{"E"}};
    		// nodeInfo에는 A~H순서대로 각 Node당 연결된 node들을 저장해둔다.
    		// HashMap에는 put을 통해 바로 array를 넣을 수 없기에 이렇게 지정해야한다.
    		
    		grapgh.put("A", nodeInfo[0]);
    		grapgh.put("B", nodeInfo[1]);
    		grapgh.put("C", nodeInfo[2]);
    		grapgh.put("D", nodeInfo[3]);
    		grapgh.put("E", nodeInfo[4]);
    		grapgh.put("F", nodeInfo[5]);
    		grapgh.put("G", nodeInfo[6]);
    		grapgh.put("H", nodeInfo[7]);
    		
    		System.out.println(bfs(grapgh, "A"));
    	}
    	
    	public static List<String> bfs(HashMap<String, String[]> grapgh, String search){
    		List<String> visited = new ArrayList<>();
    		List<String> needVisit = new ArrayList<>();
    		String node;
    		
    		needVisit.add(search);
    		while (!needVisit.isEmpty()) {
    			node = needVisit.remove(0);
    			// node가 visited에 없으면 visited에 추가 및 node의 연결된 node를 need_visited에 추가!
    			if (!visited.contains(node)) {
    				visited.add(node);
    				needVisit.addAll(Arrays.asList(grapgh.get(node)));
    				// addAll은 list데이터를 넣어야하기에 array로 되어있는 
    				// grapgh.get(node)의 값을 List로 변경 후 넣어준다.
    			}
    		}		
    		return visited;	
    	}
    }

    🔗 Reference

  • Fast Campas-JavaとSpring Web開発のプライマリ・ハイパー・パケットのオンライン化を一度に完了します。
  • https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html