알고리즘

[알고리즘] 그래프 탐색 알고리즘 - BFS, DFS

Judith Hopps 2023. 1. 26. 12:16
반응형

오늘은 비선형 구조 중 그래프를 탐색하는 알고리즘을 배워볼 시간이다. 

더보기

 

자료구조 
: '데이터의 저장'을 담당하는 것을 말한다.

분류

선형     구조 ) 리스트 , 큐, 스택

비선형 구조 ) 그래프, 트리

파일    구조 ) 순차 파일, 색인 파일, 직접파일

단순     구조 ) 정수, 실수, 문자, 문자열

 

 

알고리즘 
: 표현 및 저장된 데이터를 대상으로 하는 '문제 해결 방법'을 말한다. 

 

 

그래프 탐색 알고리즘

 

그래프 
- 여러 개체들이 연결되어 있는 자료구조

탐색
- 특정 개체를 찾기 위한 알고리즘

 

 예시 

 

 1. 경로 탐색 ( 최단거리 , 시간)

 2. 네트워크  (연결)

 3. 조합         (모든 조합 찾기)

 DFS 

깊이 우선 탐색 알고리즘 

stack을 이용 => list의 경우 push(), pop()을 이용

const graph = {
    //객체를 담아 key.value를 이용한 DFS 풀이
    //인접한 노드를 담은 객체
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A", "E"],
  D: ["B", "F"],
  E: ["C","G"],
  F: ["D","H","I"],
  G: ["E","J","K"],
  H: ["F","L"],
  I: ["F", "M"],
  J: ["G","N"],
  K: ["G","O"],
  L: ["H"],
  M: ["I","P"],
  N: ["J"],
  O: ["K"],
  P: ["M"]
};
function DFS(graph,start) {
    let 방문O = [];
    let 방문X = [];
    
    방문X.push(start);

    while(방문X.length) {
        const node = 방문X.pop();
        if(!방문O.includes(node)) {
            방문O.push(node);
            //reverse() 제거시 그림 반대로 탐색
            방문X.push(...graph[node].reverse());
        }
    }
    return 방문O;
}

DFS(graph,"A")
(16) ['A', 'B', 'D', 'F', 'H', 'L', 'I', 'M', 'P', 'C', 'E', 'G', 'J', 'N', 'K', 'O']

 

 

 BFS 

넓이 우선 탐색 알고리즘

queue을 이용 => list의 경우 push(), shift() 을 이용

 

DFS - 깊이 우선 탐색 알고리즘 BFS  - 너비 우선 탐색 알고리즘
재귀함수, 스택 큐, 연결 리스트
검증이 쉬움 => easy 문제 시간 복잡도 낮음 => difficult 문제
수행시간 복잡 검증 어려움
O(V+E) O(V+E)

 

const graph = {
    //객체를 담아 key.value를 이용한 DFS 풀이
    //인접한 노드를 담은 객체
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A", "E"],
  D: ["B", "F"],
  E: ["C","G"],
  F: ["D","H","I"],
  G: ["E","J","K"],
  H: ["F","L"],
  I: ["F", "M"],
  J: ["G","N"],
  K: ["G","O"],
  L: ["H"],
  M: ["I","P"],
  N: ["J"],
  O: ["K"],
  P: ["M"]
};


function BFS(graph,start) {
    const 방문O = [];
    const 방문X = [];

    방문X.push(start);
    
    while(방문X.length) {
        const node = 방문X.shift();
        if(!방문O.includes(node)) {
            방문O.push(node);
            방문X.push(...graph[node]);
        }
    }
    return 방문O;
}
undefined
console.log(BFS(graph,"A"));
VM3971:1 (16) ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P']

 

참고로 배열에서 스택과 큐의 구현은 아래 글을 봐주시길 바란다.

더보기

Array.prototype.push / pop / shift  /unshift

 

스택

후입 선출 즉, push,pop으로 구현할 수 있다.

 

선입 선출 즉 push, shift으로 구현할 수 있다.

 

 

반응형