[알고리즘 / Java] 완전탐색(DFS, BFS)

2021. 9. 25. 20:21·알고리즘/개념
반응형

- DFS(깊이 우선 탐색, Depth-First Search) : 루트노드나 다른 임의노드에서 다음 분기로 넘어가긴 전에,

해당 분기를 모두 탐색하는 방법으로 탐색 후에는 다시 원점으로 돌아가 다른 분기를 탐색합니다.

  1. 자기 자신을 호출하는 순환 알고리즘의 형태입니다. 
    -> 재귀나 스택을 이용 (컴퓨터 자체가 스택구조 이기때문에 재귀만으로 가능)
  2. 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 받드시 검사해야합니다.
    (만약 검사하지 않을 경우 무한루프의 위험이 있습니다.)
    ex) visited[index] = true; // 방문
  3. 미로탐색에서 해당 분기에서 갈 수 있을 때까지 계속 가다가 더이상 갈 수 없게되면 다시 가장
    가까운 갈림길(새로운 분기)로 돌아와서 다른 방향으로 다시 탐색을 진행하는 방법과 유사합니다.
  4. 모든 노드를 방문하고자 할 때 사용합니다.
  5. BFS(너비우선탐색)에 비해 구현이 간단합니다.
  6. 반면 BFS에 비해 탐색속도가 느립니다.
public static void dfs(int node, boolean[] visited) {
	if(visited[node]) return;
    
    visited[node] = true;
    for(int nextNode : nodeList[node]) {	// nodeList: LinkedList(리스트에는 연결노드정보)
    	dfs(nextNode, visited);
    }
}

- BFS(너비 우선 탐색, Bread-First Search) : 루트노드나 다름 임의노드에서 시작한 인접노드를 먼저 탐색합니다.

  1. 재귀적으로 동작하지 않습니다.
  2. DFS와 마찬가지로 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사해야합니다.
  3. 방문한 노드들을 차례대로 저장한 후 꺼낼 수 있는 큐를 사용합니다. (FIFO)
  4. 시작 노드로부터 가까운 노드(깊이가 같은)를 먼저 방문하고 멀리 떨어져 있는 노드를 나중에 방문합니다.
  5. 두 노드 사이의 최단 경로나 임의의 경로를 찾을 때 사용합니다.
    (DFS를 사용하면 모든 경로를 다 탐색해야 할 수도 있지만, BFS는 찾고자하는 노드 주변부터 순회
    하기 때문에 효율적입니다.)
public static void dfs(int node, boolean[] visited) {
	Queue<Integer> queue = new LinkedList<Integer>();
    queue.offer(node);
    
    while(!queue.isEmpty()) {
    	node = queue.poll();
        
        if(visited[node]) continue;
        visited[node] = true;
        
        for(int nextNode : nodeList[node]) {
        	queue.add(nextNode);
        }
    }
}

 

반응형

'알고리즘 > 개념' 카테고리의 다른 글

[알고리즘 / Java] 벨만 포드 알고리즘  (0) 2023.03.12
[알고리즘 / Java] 순열과 조합  (0) 2023.02.08
'알고리즘/개념' 카테고리의 다른 글
  • [알고리즘 / Java] 벨만 포드 알고리즘
  • [알고리즘 / Java] 순열과 조합
서주냥
서주냥
간단한 것도 기록하는 습관을 가지자
  • 서주냥
    DroidLog
    서주냥
  • 전체
    오늘
    어제
    • 전체보기 (58)
      • 알고리즘 (12)
        • 백준 (4)
        • 프로그래머스 (5)
        • 개념 (3)
      • Android (43)
        • Compose (1)
      • Java (2)
      • Kotlin (1)
  • 링크

    • GitHub
  • 인기 글

  • 태그

    프로그래머스
    다이나믹 프로그래밍
    ConstraintLayout
    Clean Architecture
    클린 아키텍처
    백준
    textunit
    BLE
    자바
    안드로이드
    투 포인터
    reified
    이진 탐색
    코루틴
    moshi
    Coroutine
    블루투스
    viewmodel
    FusedLocationProviderClient
    viewpager2
    뷰모델
    SnackBar
    최단 경로
    RecyclerView
    코틀린
    알고리즘
    벨만 포드
    Coroutine Flow
    debounce
    Hilt
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
서주냥
[알고리즘 / Java] 완전탐색(DFS, BFS)
상단으로

티스토리툴바