가수면

그래프 순회 본문

CS/CS

그래프 순회

니비앙 2023. 5. 30. 00:47

너비 우선 탐색

2개의 큐를 이용

A큐 - 방문한 노드들을 쌓는다. 쌓일 때 연결된 노드들을 B큐에 추가한다.

B큐 -

초깃값을 설정한 뒤 큐에 값이 없을 때까지 실행한다.

맨 앞의 노드를 A로 내보낸 뒤 해당 노드와 연결된 노드를 큐에 추가한다.

이때 A에 중복된 노드가 있다면 A에 저장하지 않는다

 

자바스크립트 ver.

class Graph {
    constructor() {
        this.adjacencyList = {};
    }
    addVertex(vertex) {
        if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(vertex1, vertex2) {
        this.adjacencyList[vertex1].push(vertex2);
        this.adjacencyList[vertex2].push(vertex1);
    }
    breadthFirst(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(v => {
                if (!visited[v]) {
                    visited[v] = true;
                    queue.push(v);
                }
            });
        }
        return result;
    }
}

파이썬 ver.

def bfs(graph, start_node):
    visited = list()
    need_visit = list()
    
    need_visit.append(start_node)
    
    while need_visit:
        node = need_visit.pop(0)
        if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
    
    return visited

깊이 우선 탐색

1개의 큐와 1개의 스택을 이용

큐 - 방문한 노드들을 쌓는다. 쌓일 때 연결된 노드들을 스택에 추가한다.

스택 -

초깃값을 설정한 뒤 스택에 값이 없을 때까지 실행한다.

맨 뒤의 노드를 큐로 내보낸 뒤 해당 노드와 연결된 노드를 스택에 추가한다.

이때 큐에 중복된 노드가 있다면 큐에 저장하지 않는다

 

재귀적 용법 사용

class Graph {
    constructor() {
        this.adjacencyList = {};
    }
    addVertex(vertex) {
        if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(vertex1, vertex2) {
        this.adjacencyList[vertex1].push(vertex2);
        this.adjacencyList[vertex2].push(vertex1);
    }
    depthFirstRecursive(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(v => {
                if (!visited[v]) {
                    return dfs(v)
                }
            });
        })(start);

        return result;
    }
}

순환적 용법 사용

자바스크립트 ver.

class Graph {
    constructor() {
        this.adjacencyList = {};
    }
    addVertex(vertex) {
        if (!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(vertex1, vertex2) {
        this.adjacencyList[vertex1].push(vertex2);
        this.adjacencyList[vertex2].push(vertex1);
    }
    depthFirstIterative(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(v => {
                if (!visited[v]) {
                    visited[v] = true;
                    stack.push(v)
                }
            });
        }
        return result;
    }
}

파이썬 ver.

def dfs(graph, start_node):
    visited, to_visit = list(), list([start_node])

    while to_visit:
        node = to_visit.pop()
        if node not in visited:
            visited.append(node)
            to_visit.extend(graph[node])

    return visited

'CS > CS' 카테고리의 다른 글

삽입 정렬 알고리즘  (0) 2023.11.09
버블 정렬 알고리즘  (0) 2023.11.09
그래프 구현  (0) 2023.05.30
해시 테이블 구현  (0) 2023.05.29
이진 힙 구현  (0) 2023.05.29
Comments