κ·Έλν νμ
- κ·Έλν νμμ λΉμ νκ΅¬μ‘°μΈ κ·Έλνλ‘ ννλ λͺ¨λ μλ£(μ μ )λ₯Ό λΉ μ§μμ΄ νμνλ κ²
μ’
λ₯
- κΉμ΄ μ°μ νμ(Depth Frist Search, DFS)
- λλΉ μ°μ νμ(Breadth First Search, BFS)
DFS (κΉμ΄ μ°μ νμ)
- μμ μ μ μ μμμΌλ‘ ν λ°©ν₯μΌλ‘ κ° μ μλ κ²½λ‘κ° μλ κ³³κΉμ§ κΉμ΄ νμ
- λμ΄μ κ° κ³³μ΄ μλ€λ©΄, κ°μ₯ λ§μ§λ§μ λ§λ¬λ κ°λ¦ΌκΈΈ κ°μ μ΄ μλ μ μ μΌλ‘ λμκ° κ°μ λ°©μμΌλ‘ λ€μ νμ
- κ°μ₯ λ§μ§λ§μ λ§λ¬λ κ°λ¦ΌκΈΈμ μ μ μΌλ‘ λλμκ°μ λ€μ κΉμ΄ μ°μ νμμ λ°λ³΅ν΄μΌ νλ―λ‘ νμ
μ μΆ(LIFO) ꡬ쑰μ μ€ν μ¬μ©
- μκ° λ³΅μ‘λ
- (N: μ μ μ μ, E: κ°μ μ μ)
- μΈμ 리μ€νΈ ꡬν: O(N+E)
- μΈμ νλ ¬ ꡬν: O(N^2)
DFS μκ³ λ¦¬μ¦ - μ¬κ·
static int N = 5;
static int[][] matrix = new int[N][N];
static boolean[] visited = new boolean[N];
static void dfs(int node) {
visited[node] = true;
for(int next = 0; next < N; next++) {
if(visited[next] || matrix[node][next] == 0)
continue;
dfs(next);
}
}
DFS μκ³ λ¦¬μ¦ - λ°λ³΅λ¬Έ (μ€ν μ΄μ©)
- input μ¬μ΄μ¦κ° ν΄ κ²½μ° μ΄μ©
- stackμ μ΄μ©νλ©΄ μμ μ μ κ³Ό λ¨Ό μ μ λ¨Όμ νμΈ
static int N = 5;
static int[][] matrix = new int[N][N];
static void dfs(int node) {
boolean[] visited = new boolean[N];
Stack<Integer> st = new Stack<>();
st.push(node);
while(!st.isEmpty()) {
int cur = st.pop();
if(visited[cur]) continue;
visited[cur] = true;
for(int next = 0; next < N; next++) {
if(visited[next] || matrix[node][next] == 0)
continue;
st.push(next);
}
}
}
BFS (λλΉ μ°μ νμ)
- νμ μμμ μ μΈμ ν μ μ λ€μ λ¨Όμ λͺ¨λ μ°¨λ‘λ‘ λ°©λ¬Έ
- μμμ μ μΈμ μ μ μ λ€μ μμμ μΌλ‘ λ€μ μΈμ ν μ μ λ€ μ°¨λ‘λ‘ λ°©λ¬Έ
- μΈμ ν μ μ λ€μ λν΄ νμν ν, μ°¨λ‘λ‘ λ€μ λλΉ μ°μ νμ μ§νν΄μΌ νλ―λ‘ μ μ
μ μΆ(FIFO) ννμ μλ£κ΅¬μ‘°μΈ ν μ΄μ©
- κ°μ€μΉκ° μλ κ·Έλνμμ BFSλ‘ μ΅λ¨ κ²½λ‘ κ΅¬νκΈ° κ°λ₯
- μκ° λ³΅μ‘λ
- (N: μ μ μ μ, E: κ°μ μ μ)
- μΈμ 리μ€νΈ ꡬν: O(N+E)
- μΈμ νλ ¬ ꡬν: O(N^2)
BFS μκ³ λ¦¬μ¦
static int N = 5;
static int[][] matrix = new int[N][N];
static void dfs(int node) {
boolean[] visited = new boolean[N];
Queue<Integer> q = new LinkedList<>();
q.offer(node);
while(!q.isEmpty()) {
int cur = q.poll();
for(int next = 0; next < N; next++) {
if(visited[next] || matrix[node][next] == 0)
continue;
visited[cur] = true;
q.offer(next);
}
}
}