그래프 개념

DFS 그래프순회

좌) A 를 시작점으로, 우) C를 시작점으로

  • 선택한 정점(A)의 인접점(B,C,D) 중 하나를 선택(B)하고 방문한다. 방문한 정점의 인접점이 없을 경우(이전 정점제외) 이전 정점의 다른 인접점을 탐색한다.
  • 방문한 정점(B)이 인접점이 있을 경우 인접점(E)을 방문하고 위의 논리를 반복한다.
  • 이때 인접점이 여러 개일 경우 어떤 것을 우선으로 방문할 지 정할 수 있다. 그림 예시에서는 abc순으로 정했다.

 

DFS 그래프순회 구현하기

  • 참고) 여러 인접점에 대한 우선순위를는 고려하지 않았다.
class Graph {
    // ...constructor 및 기타 메소드: 글 상단 [그래프개념] 링크 참조


  // 재귀를 이용한 방법
  depthFirstTraverseRecursive(startVert) {
    const visitingMark = {};
    const result = [];
    const travel = (vert) => {
      if (visitingMark[vert]) return;
      visitingMark[vert] = true;
      result.push(vert);
      this.adjacencyList[vert].forEach((linkedVert) => {
        travel(linkedVert);
      });
    };
    travel(startVert);
    return result;
  }

  // 반복문을 이용한 방법 Stack의 개념을 이용한다.
  depthFirstTraverseRoop(startVert) {
    const stack = [];
    const visitingMark = {};
    const result = [];
    stack.push(startVert);
    while (stack.length) {
      const current = stack.pop();
      if (!visitingMark[current]) {
        visitingMark[current] = true;
        result.push(current);
      }
      this.adjacencyList[current].forEach((linkedVert) => {
        if (visitingMark[linkedVert]) return;
        stack.push(linkedVert);
      });
    }
    return result;
  }

}

 

BFS 그래프순회

좌) A 시작점, 우) C 시작점

  • 선택한정점(A)의 인접정점(B,C,D)을 모두 순회한 후 인접정점 중 하나(B)의 인접정점들(E,F)을 순회한다.

 

BFS 그래프 순회 구현

class Graph {
    // ...생략.. 글 상단 [그래프 기본] 참고


    // queue 자료형을 활용한다. 임시로 array를 큐라고 가정하고 진행함
  breathFisrtTraverse(startVert) {
    const queue = []; // unshift: enqueue, pop: dequeue
    const visitingMark = {};
    const result = [];
    queue.unshift(startVert);

    while (queue.length) {
      const current = queue.pop();
      if (!visitingMark[current]) {
        visitingMark[current] = true;
        result.push(current);
      }
      this.adjacencyList[current].forEach((linkedVert) => {
        if (visitingMark[linkedVert]) return;
        queue.unshift(linkedVert);
      });
    }
    return result;
  }
}

+ Recent posts