본문 바로가기
Skill Stacks/Javascript

Udemy - Javascript - Graph Traversal

by JayAlex07 2023. 2. 27.

Udemy - Javascript - Graph Traversal

Udemy JavaScript

 

그래프 순회

그래프에 있는 모든 노드들을 방문할 필요까지는 없다

그래프 순회를 할 때에는 visiting / updating / checking 이 중요하다


 

깊이 우선 그래프 (Depth First)

vertex의 이웃 중 방문하지 않은 하나의 이웃으로 가는 것이다

이것을 모든 Vertex를 방문할때까지 순회를 한다

  • 더 작은 이웃을 기준으로 깊이 우선 순회하기

 

넓이 순회 (Breadth First)

이웃된 노드가 2개면, 그 2개를 모두 순회하며 그래프를 순회한다


 

기본 그래프 만드는 코드

Graph 클래스에 DFS와 BFS를 넣을 것

class Graph {
    constructor(){
        this.adjacencyList = {}
    }

    addVertex(vertex){
        // 똑같은 vertex가 들어오면, 이미 있는 것을 덮어 쓴
        if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }

    addEdge(v1, v2) {
        this.adjacencyList[v1].push(v2);
        this.adjacencyList[v2].push(v1);
    }

    removeEdge(v1, v2) {
        this.adjacencyList[v1] = this.adjacencyList[v1].filter(
            v => v !== v2
        );
        this.adjacencyList[v2] = this.adjacencyList[v2].filter(
            v => v !== v1
        );
    }

    removeVertex(vertex) {
        while (this.adjacencyList[vertex].length){
            const adjacencyVertex = this.adjacencyList[vertex].pop();
            this.removeEdge(vertex, adjacencyListVertex);
        }
        delete this.adjacencyList[vertex]
    }
}

 

DF 재귀 코드

forEach 문을 통해, 이웃 중 제일 앞에 있는 vertex부터 순회를 한다

DFRecursive(start) {
    const result = [];
    const visited = {};
    const adjacencyList = this.adjacencyList;

    (function dfs(vertex) {
        if (!vertex) return null;
        visited[vertex] = true;
        result.push(vertex);
        adjacencyList[vertex].forEach(neighbor => {
            if (!visited[neighbor]) {
                return dfs(neighbor);
            }
        })


    }) (start)

    return result;   
}

 

DF Iterative 코드

stack에 넣고, pop을 하기 때문에 제일 뒤에 있는 요소부터 순회를 한다

재귀랑 같은 깊이 탐색이지만, 나오는 값은 다를 수도 있다 (상관 없음)

DFIterative(start) {
    const stack = [start];
    const result = [];
    const visited = {};
    let currentVertex

    visited[start] = true;

    while (stack.length) {
        currentVertex = stack.pop()
        result.push(currentVertex)

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

 

넓이 순회 (Breadth First) 코드

BFS(start) {
    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;
}

'Skill Stacks > Javascript' 카테고리의 다른 글

Udemy - Node.js [JavaScript Basics]  (0) 2023.04.06
Udemy - Javascript - Graph  (0) 2023.02.24
Udemy - Javascript - Hash Table  (0) 2023.02.23
Udemy - Javascript - Binary Heaps  (0) 2023.02.22
Udemy - Javascript - Tree Traversal  (0) 2023.02.21