일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- migration
- JavaScript
- REACT
- try catch
- current_date
- update
- expire_logs_days
- Effective Java 3/e
- Effective Java
- 퀵소트
- npm
- Chunk
- java
- log4j2
- git
- spring cloud
- 정규표현식
- Regular expression
- spring
- REACTJS
- regex
- nodejs
- MySQL
- Express
- Node
- log_bin
- upgrade
- mysql 5.5
- eslint
- Spring Batch
- Today
- Total
내 세상
[Algorithms] DFS, BFS, Dijkstra, Bellman-Ford, Floyd, Heap 본문
[Algorithms] DFS, BFS, Dijkstra, Bellman-Ford, Floyd, Heap
sga8 2019. 4. 30. 23:31DFS (Depth-First Search, 깊이 우선 탐색)
- 방식 :
- 모든 노드를 탐색 후 자신에게 돌아와야 끝난다.
- 역추적(Backtracking) 과정이 있어 Stack / Recursion을 사용
- 자기 자신을 호출하는 순환 알고리즘의 형태
- 사용 예시
- 미로 생성
- Cycle Detection
- Topological Sorting
- 시간복잡도 (정점 N, 간선 E)
- 인접 리스트로 표현된 그래프 O(N+E)
- 인접 행렬로 표현된 그래프 O(N^2)
- 장점
- 현 경로상의 노드들만 기억하면 되므로 저장 공간의 수요가 비교적 적다.
- 목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
- 단점
- 해가 없는 경로에 깊이 빠질 가능성이 있음. → 임의로 지정한 깊이까지만 탐색하도록 설정
BFS (Breath-First Search, 너비 우선 탐색)
- 방식
- 모든 노드를 탐색 후 끝난다
- 현재 연결된 모든 노드를 차례대로 탐색하기 위해 Queue를 사용
- 사용 예시
- 두 노드 사이의 최단 경로(Shortest Paths)
- 임의의 경로 탐색
- 최소신장트리(Minimum Spanning Tree)
- 시간복잡도 (정점 N, 간선 E)
- 인접 리스트로 표현된 그래프 O(N+E)
- 인접 행렬로 표현된 그래프 O(N^2)
- 장점
- 한 갈림길에서 연결되는 모든 길을 한번씩 탐색하기 때문에 최단 경로를 찾을 수 있음
- 목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.
- 단점
- 경로가 매우 길 경우 탐색 가지가 급격히 증가함에 따라 저장 공간의 수요가 매우 크다.
- 해로 가는 경로들 모두가 같은 거리일 대 헛된 탐색
※※※※※※ V: Vertex, 정점, 노드
※※※※※※ E: Edge, 간선, 변
Dijkstra (시간복잡도 O((V+E)logV))
- 그리디 알고리즘의 관점
- 한 정점에서부터 다른 모든 정점으로의 최단경로를 구하는 알고리즘
→ A* 알고리즘이 Dijkstra의 확장된 알고리즘
- 제약 사항
- 그래프 내에 음의 가중치 합을 가지는 사이클이 없을 때에만 동작함
- 음의 가중치를 갖는 간선이 없을 경우에만 아래의 시간복잡도에 동작함
→ 음의 가중치가 있을 경우 무한히 사이클을 돌며 거리가 작아지기 때문.
→ 다익스트라는 한 번 경로를 확정한 정점에 대해서는 다시는 갱신이 일어나지 않는다는 규칙이 있기 때문임.
- Priority Queue와의 관계
- 통상적인 시간 복잡도는 O(E+V^2) = O(V^2)
- MinHeap을 이용하였을 때 시간 복잡도는 O((E+V)logV)
→ 이유는 MinHeap을 사용하면 logV만에 최소값이 가장 위로 정렬되기 때문임.
Bellman-Ford (시간복잡도 O(VE))
- DP 관점
- 한 정점에서부터 다른 모든 정점으로의 최단경로를 구하는 알고리즘
- 다익스트라에서는 할 수 없었던 음의 가중치도 계산할 수 있음. 하지만 느림.
- 전체 수행을 정점(N)보다 1만큼 작게 수행하도록 함.
Floyd Washall (시간복잡도 O(V^3))
- 가능한 모든 노드쌍들에 대한 최단거리를 구하는 알고리즘
- 모든 정점에서 모든 정점으로의 최단 경로를 구하고자 하는 경우에 사용됨.
- 사이클이 없는 경우 음수 가중치 처리가 가능함.
Heap (시간복잡도 O(logN))
- 최대값 또는 최소값을 빠르게 찾기 위해서 고안된 트리 모양의 자료구조
- max-heap : 부모 노드의 값이 자식 노드의 값보다 크다, 가장 큰 값을 빠르게 찾기 위한 것
- min-heap : 부모 노드의 값이 자식 노드의 값보다 작다, 가장 작은 값을 빠르게 찾기 위한 것
- 조건
- Binary Heap은 완전이진트리 구조 이여야 한다.
'Coding > Algorithms' 카테고리의 다른 글
[Algorithms] Sort Special - Inserting, Counting, Quick, Heap (0) | 2019.05.01 |
---|---|
[Algorithms] Topological Sort, 위상정렬 (0) | 2019.04.30 |
[Algorithms] 백준 13460번 구슬 탈출 2 (0) | 2019.03.30 |
[Algorithm] 백준 14503번 로봇 청소기 (0) | 2019.03.27 |
[Algorithm] 백준 2146번 다리 만들기 (0) | 2019.03.27 |