DFS와 BFS의 방문처리 시점이 다른 이유,,

Sanghyeop Lee·2023년 1월 1일
1

DFSBFS를 구현할 때 visited 배열 등을 사용해서 방문 처리를 하는데 아래처럼 방문 처리를 해주는 시점이 다르다.

  • DFS (재귀)
    public void dfs(int i) {
		visited[i] = true; //방문한 직후 visited 처리	
		for(int j=1; j<n+1; j++) {
			if(map[i][j] == 1 && visited[j] == false) {
				dfs(j);
			}
		}
	}
  • BFS
	public void bfs(int i) {
		Queue<Integer> q = new LinkedList<>();
		q.offer(i);
		visited[i] = true;//시작 노드 큐에 넣어주면서 방문하기 전에 visited 처리		
		while(!q.isEmpty()) {
			int temp = q.poll();
			for(int j=1; j<n+1; j++) {
				if(map[temp][j] == 1 && visited[j] == false) {
					q.offer(j);
					visited[j] = true;//나머지 노드도 방문하기 전에 visited 처리
				}
			}
		}
	}

DFS는 노드를 방문하면서 visited 처리를 하고 BFS는 큐에 넣어준 이후 방문하기 전에 visited 처리를 하는데 왜 처리하는 시점이 다른지 궁금해져서 찾아보았다.

  • DFS
    DFS는 다음에 탐색하기 위해 스택에 넣어주는 순서탐색을 실행하는 순서가 동일하지 않기 때문에 스택에 넣어주면서 방문하기 전에 visited 처리를 할 경우 visited 처리가 되는 순서가 실제 탐색하는 순서와 다르다고 한다,, (재귀로 구현해도 call stack을 사용하므로 동일할 것으로 생각됨..!)
  • BFS
    BFS는 탐색하기 위해 큐에 넣어주는 순서실제 탐색하는 순서가 일치하기 때문에 방문하기 전 또는 방문한 후 visited 처리를 해줘도 visited 처리가 되는 순서가 실제 탐색하는 순서와 동일하다고 한다,,!

참고

profile
개발자꿈나무

0개의 댓글