π¦ 4. Trees and Graphs
4. Trees and Graphs
νΈλ¦¬μ μ’ λ₯
νΈλ¦¬λ λ Έλλ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°μ΄λ€.
- νΈλ¦¬λ νλμ λ£¨νΈ λ Έλλ₯Ό κ°λλ€.
- λ£¨νΈ λ Έλλ 0κ° μ΄μμ μμ λ Έλλ₯Ό κ°μ§λ€.
- κ·Έ μμ λ Έλ λν 0κ° μ΄μμ μμ λ Έλλ₯Ό κ°μ§λ©° μ΄λ λ°λ³΅μ μΌλ‘ μ μλλ€.
νΈλ¦¬μλ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν μ μλ€.
λ Έλλ€μ νΉμ μμλ‘ λμ΄λ μλ μκ³ κ·Έλ μ§ μμ μλ μλ€.
κ° λ Έλλ μ΄λ ν μλ£νμΌλ‘λ νν κ°λ₯νλ€.
κ° λ Έλλ λΆλͺ¨ λ Έλλ‘μ μ°κ²°μ΄ μμ μλ μκ³ μμ μλ μλ€.
1
2
3
4
Class Node {
public String name;
public Node[] children;
}
μ΄ λ
Έλ ν΄λμ€λ₯Ό ν¬ν¨νλ Tree
ν΄λμ€λ₯Ό μ μν μλ μλ€.
λ©΄μ λ¬Έμ μμλ μΌλ°μ μ Tree ν΄λμ€λ₯Ό μ¬μ©νμ§ μλλ€.
νΈλ¦¬ λ° κ·Έλν λ¬Έμ λ€μ λλΆλΆ μΈλΆμ¬νμ΄ λͺ¨νΈνκ±°λ κ°μ μμ²΄κ° νλ¦° κ²½μ°κ° λ§λ€.
λ€μ μ΄μλ€μ μ μνκ³ νμνλ©΄ λͺ ννκ² ν΄ μ€ κ²μ μꡬνμ.
νΈλ¦¬ vs μ΄μ§ νΈλ¦¬
μ΄μ§ νΈλ¦¬λ κ° λ Έλκ° μ΅λ λ κ°μ μμμ κ°λ νΈλ¦¬μ΄λ€.
λͺ¨λ νΈλ¦¬κ° μ΄μ§ νΈλ¦¬λ μλλ€.
μ’ μ’ μ΄μ§ νΈλ¦¬κ° μλ νΈλ¦¬λ₯Ό λ€λ€μΌ νλ€.
μλ₯Ό λ€μ΄ μ νλ²νΈλ₯Ό ννν λ νΈλ¦¬λ₯Ό μ¬μ©νλ€κ³ κ°μ νλ©΄,
κ° λ Έλκ° 10κ°μ μμ (0 ~ 9)μ κ°λ 10μ°¨ νΈλ¦¬λ₯Ό μ¬μ©ν΄μΌ νλ€.
μμμ΄ μλ λ
Έλλ λ§λ¨ λ
Έλ
λΌκ³ λΆλ₯Έλ€.
μ΄μ§ νΈλ¦¬ vs μ΄μ§ νμ νΈλ¦¬
μ΄μ§ νμ νΈλ¦¬λ λͺ¨λ λ Έλκ° λ€μ 쑰건μ λ§μ‘±νλ νΈλ¦¬μ΄λ€.
1
'λͺ¨λ μΌμͺ½ μμλ€ <= n < 'λͺ¨λ μ€λ₯Έμͺ½ μμλ€' μμ±μ΄ λͺ¨λ λ
Έλ nμ λν΄ λ°λμ μ°Έμ΄λ€.
λ€μ μΌμͺ½ νΈλ¦¬λ μ΄μ§ νμ νΈλ¦¬μ΄μ§λ§ μ€λ₯Έμͺ½μ 12κ° 8μ μΌμͺ½μ μκΈ° λλ¬Έμ μ΄μ§ νμ νΈλ¦¬κ° μλλ€.
κ· ν vs λΉκ· ν
κ· ν νΈλ¦¬μ μΌλ°μ μΈ μ νμΌλ‘λ λ λ-λΈλνΈλ¦¬μ AVL νΈλ¦¬κ° μλ€.
λ§μ νΈλ¦¬κ° κ· ν μ‘ν μκΈ΄ νμ§λ§ μ λΆ κ·Έλ° κ²μ μλλ€.
κ· νμ μ‘λλ€λ κ²μ΄ μΌμͺ½κ³Ό μ€λ₯Έμͺ½ λΆλΆ νΈλ¦¬μ ν¬κΈ°κ° μμ ν κ°κ² νλ κ²μ μλ―Ένμ§λ μλλ€.
μμ μ΄μ§ νΈλ¦¬
μμ μ΄μ§ νΈλ¦¬λ νΈλ¦¬μ λͺ¨λ λμ΄μμ λ Έλκ° κ½ μ°¨ μλ μ΄μ§ νΈλ¦¬μ΄λ€.
λ§μ§λ§ λ λ²¨μ΄ κ½ μ°¨ μμ§ μμλ λμ§λ§ λ Έλκ° μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μμ°¨μ μΌλ‘ μ±μμ ΈμΌ νλ€.
μ μ΄μ§ νΈλ¦¬
μ μ΄μ§ νΈλ¦¬λ λͺ¨λ λ Έλμ μμμ΄ μκ±°λ μ νν λ κ° μλ κ²½μ°λ₯Ό λ§νλ€.
μμμ΄ νλλ§ μλ λ Έλκ° μ‘΄μ¬ν΄μλ μ λλ€.
ν¬ν μ΄μ§ νΈλ¦¬
ν¬ν μ΄μ§ νΈλ¦¬λ μ μ΄μ§ νΈλ¦¬μ΄λ©΄μ μμ μ΄μ§ νμΈ κ²½μ°λ₯Ό λ§νλ€.
λͺ¨λ λ§λ¨ λ Έλκ° κ°μ λ 벨μ μκ³ λ§μ§λ§ λ 벨μ λ Έλμ κ°μκ° μ΅λμ΄μ΄μΌ νλ€.
μ΄μ§ νΈλ¦¬ μν
μ€μ μν
μ€μμν(in-order traversal)λ μΌμͺ½ κ°μ§ β νμ¬ β μ€λ₯Έμͺ½ κ°μ§
μμλ‘ λ
Έλλ₯Ό λ°©λ¬Ένλ€.
μ΄μ§ νμ νΈλ¦¬λ₯Ό μ€μ μννλ©΄ μ€λ¦μ°¨μμΌλ‘ λ°©λ¬Ένκ² λλ€.
1
2
3
4
5
6
7
void inOrderTraversal(TreeNode node) {
if (node != null) {
inOrderTraversal(node.left);
visit(node);
inOrderTraversal(node.right);
}
}
μ μ μν
μ μμν(pre-order traversal)μ μμ λ Έλλ³΄λ€ νμ¬ λ Έλλ₯Ό λ¨Όμ λ°©λ¬Ένλ λ°©λ²μ΄λ€.
κ°μ₯ λ¨Όμ λ°©λ¬Ένκ² λλ λ Έλλ μΈμ λ 루νΈμ΄λ€.
1
2
3
4
5
6
7
void preOrderTraversal(TreeNode node) {
if (node != null) {
visit(node);
preOrderTraversal(node.left);
preOrderTraversal(node.right);
}
}
νμ μν
νμμν(post-order traversal)λ λͺ¨λ μμ λ Έλλ€μ λ¨Όμ λ°©λ¬Έν λ€ λ§μ§λ§μ νμ¬ λ Έλλ₯Ό λ°©λ¬Ένλ λ°©λ²μ λ§νλ€.
κ°μ₯ λ§μ§λ§μ λ°©λ¬Ένκ² λ λ Έλλ νμ 루νΈμ΄λ€.
1
2
3
4
5
6
7
void postOrderTraversal(TreeNode node) {
if (node != null) {
postOrderTraversal(node.left);
postOrderTraversal(node.right);
visit(node);
}
}
μ΄μ§ ν(μ΅μνκ³Ό μ΅λν)
μ΅μνμ νΈλ¦¬μ λ§μ§λ§ λ¨κ³μμ μ€λ₯Έμͺ½ λΆλΆμ λΊ λλ¨Έμ§ λΆλΆμ΄ κ°λ μ±μμ Έ μλ€λ μ μμ μμ μ΄μ§ νΈλ¦¬μ΄λ©°, κ° λ Έλμ μμκ° μμλ€μ μμλ³΄λ€ μλ€λ νΉμ±μ΄ μλ€.
λ°λΌμ 루νΈλ νΈλ¦¬ μ 체μμ κ°μ₯ μμ μμμ΄λ€.
μ½μ
μ΅μνμ μμλ₯Ό μ½μ ν λ μΈμ λ νΈλ¦¬μ λ°λ°λ₯μμ μ½μ μ μμνλ€.
μλ‘μ΄ μμλ μμ νΈλ¦¬μ μμ±μ μλ°°λμ§ μλλ‘ λ°λ°λ₯ κ°μ₯ μ€λ₯Έμͺ½μΌλ‘ μ½μ λλ€.
μ΄ν μ λλ‘ λ μ리λ₯Ό μ°Ύμ λκΉμ§ λΆλͺ¨ λ Έλμ κ΅νν΄ λκ°λ©°
μ΅μ μμλ₯Ό μμͺ½μΌλ‘ μ¬λ¦°λ€.
νμ μλ λ
Έλμ κ°μλ₯Ό nμ΄λΌ ν λ μ΄ μ°μ°μ O(log N)
μκ°μ΄ κ±Έλ¦°λ€.
μ΅μ μμ λ½μλ΄κΈ°
μ΅μ μμλ μΈμ λ κ°μ₯ μμ λμΈλ€.
νμμ μ΄λ»κ² μ κ±°νλλκ° κΉλ€λ‘μ΄ λΆλΆμ΄λ€.
μ΅μ μμλ₯Ό μ κ±°ν νμ νμ μλ κ°μ₯ λ§μ§λ§ μμμ κ΅ννλ€.
κ·Έ λ€μ μ΅μνμ μ±μ§μ λ§μ‘±νλλ‘ ν΄λΉ λ Έλλ₯Ό μμ λ Έλμ κ΅νν΄ λκ°μΌλ‘μ¨ λ°μΌλ‘ 보λΈλ€.
μ΄ μκ³ λ¦¬μ¦λ O(log N)
μκ°μ΄ κ±Έλ¦°λ€.
νΈλΌμ΄
μ λμ¬ νΈλ¦¬ (prefix tree) λΌκ³ λ λΆλ¦°λ€.
νΈλΌμ΄λ Nμ°¨ νΈλ¦¬μ λ³μ’ μΌλ‘ κ° λ Έλμ λ¬Έμλ₯Ό μ μ₯νλ μλ£κ΅¬μ‘°μ΄λ€.
λ°λΌμ νΈλ¦¬λ₯Ό μλμͺ½μΌλ‘ μννλ©΄ λ¨μ΄ νλκ° λμ¨λ€.
* λ
Έλ
(Null Node)λ μ’
μ’
λ¨μ΄μ λμ λνλμ λ¨μ΄κ° μμ±λμμμ μλ¦°λ€.
μ λμ¬λ₯Ό λΉ λ₯΄κ² μ°Ύμ보기 μν μμ£Ό νν λ°©μμΌλ‘ λͺ¨λ μΈμ΄λ₯Ό νΈλΌμ΄μ μ μ₯νλ λ°©μμ΄ μλ€.
νΈλΌμ΄λ₯Ό μ΄μ©νλ©΄ μμ£Ό λΉ λ₯΄κ² νμΈ κ°λ₯νλ€.
νΈλΌμ΄λ κΈΈμ΄κ° K μΈ λ¬Έμμ΄μ΄ μ£Όμ΄μ‘μ λ O(K)
μκ°μ ν΄λΉ λ¬Έμμ΄μ΄ μ ν¨ν μ λμ¬μΈμ§ νμΈν μ μλ€.
κ·Έλν
νΈλ¦¬λ κ·Έλνμ ν μ’ λ₯μ΄λ€.
νμ§λ§ λͺ¨λ κ·Έλνκ° νΈλ¦¬λ μλλ€.
νΈλ¦¬λ μ¬μ΄ν΄μ΄ μλ νλμ μ°κ²° κ·Έλνμ΄λ€.
κ·Έλνλ λ¨μν λ Έλμ κ·Έ λ Έλλ₯Ό μ°κ²°νλ κ°μ (edge)λ₯Ό νλλ‘ λͺ¨μλμ κ²κ³Ό κ°λ€.
- κ·Έλνλ λ°©ν₯μ±μ΄ μμ μλ μκ³ μμ μλ μλ€.
- κ·Έλνλ μ¬λ¬ κ³ λ¦½λ λΆλΆ κ·Έλνλ‘ κ΅¬μ±λ μ μλ€. λͺ¨λ μ μ μ κ°μ κ²½λ‘κ° μ‘΄μ¬νλ κ·Έλνλ
μ°κ²° κ·Έλν
λΌκ³ λΆλ₯Έλ€. - κ·Έλνμλ μ¬μ΄ν΄μ΄ μμ μλ μκ³ μμ μλ μλ€. μ¬μ΄ν΄μ΄ μλ κ·Έλνλ
λΉμν κ·Έλν
λΌκ³ λΆλ₯Έλ€.
μΈμ 리μ€νΈ
μΈμ 리μ€νΈ(adjacency list)λ κ·Έλνλ₯Ό ννν λ μ¬μ©λλ κ°μ₯ μΌλ°μ μΈ λ°©λ²μ΄λ€.
λͺ¨λ μ μ μ μΈμ 리μ€νΈμ μ μ₯νλ€.
무방ν₯ κ·Έλνλ (a, b)
κ°μ μ΄ λ λ² μ μ₯λλ€.
1
2
3
4
5
6
7
8
Class Graph {
public Node[] nodes;
}
Class Node {
public String name;
public Node[] children;
}
κ·Έλνλ νΈλ¦¬μ λ¬λ¦¬ νΉμ λ Έλμμ λ€λ₯Έ λͺ¨λ λ Έλλ‘ μ κ·Όμ΄ κ°λ₯νμ§λ μμ Graph λΌλ ν΄λμ€λ₯Ό μ¬μ©νλ€.
λ°°μ΄, ν΄μν μ΄λΈκ³Ό κ° μΈλ±μ€λ§λ€ μ‘΄μ¬νλ λ λ€λ₯Έ 리μ€νΈλ₯Ό μ΄μ©ν΄ μΈμ 리μ€νΈλ₯Ό ννν μ μλ€.
1
2
3
4
5
6
7
0: 1
1: 2
2: 0, 3
3: 2
4: 6
5: 4
6: 5
μΈμ νλ ¬
μΈμ νλ ¬μ NxN λΆλ¦° νλ ¬λ‘μ¨ matrix[i][j] == true
μ΄λ©΄ i -> j
κ°μ μ΄ μλ€λ κ²μ΄λ€.
μΈμ νλ ¬μ μ‘°κΈ ν¨μ¨μ±μ΄ λ¨μ΄μ§λ€.
μ΄λ€ λ Έλμ μΈμ ν λ Έλλ₯Ό μ°ΎκΈ° μν΄μ λͺ¨λ λ Έλλ₯Ό μ λΆ μνν΄μΌ ν μ μλ€.
κ·Έλν νμ
κΉμ΄ μ°μ νμ(DFS)λ λ£¨νΈ λ Έλμμ μμν΄μ λ€μ λΆκΈ°λ‘ λκ±°κ°κΈ° μ μ ν΄λΉ λΆκΈ°λ₯Ό μλ²½νκ² νμνλ λ°©λ²μ΄λ€.
λλΉ μ°μ νμ(BFS)λ λ£¨νΈ λ Έλμμ μμν΄μ μΈμ ν λ Έλλ₯Ό λ¨Όμ νμνλ λ°©λ²μ΄λ€.
DFSλ κ·Έλνμμ λͺ¨λ λ Έλλ₯Ό λ°©λ¬Ένκ³ μ ν λ μ νΈλλ νΈμ΄λ€.
BFSλ λ λ Έλ μ¬μ΄μ μ΅λ¨ κ²½λ‘ νΉμ μμμ κ²½λ‘λ₯Ό μ°Ύκ³ μΆμ λ μΌλ°μ μ΄λ€.
κΉμ΄ μ°μ νμ(DFS)
νΈλ¦¬μ μνμ κ·Έλν νμμ κ°μ₯ ν° μ°¨μ΄λ μ΄λ€ λ Έλλ₯Ό λ°©λ¬Ένμλμ§ μ¬λΆλ₯Ό λ°λμ κ²μ¬ν΄μΌ νλ€λ κ²μ΄λ€.
κ·Έλ μ§ μμ κ²½μ° λ¬΄ν루νμ λΉ μ§ μνμ΄ μλ€.
1
2
3
4
5
6
7
8
9
10
void search(Node root) {
if (root == null) return;
visit(root);
root.visited = true;
for each (Node n in root.adjacent) {
if (n.visited == false) {
search(n);
}
}
}
λλΉ μ°μ νμ(BFS)
BFS λ μ¬κ·μ μΌλ‘ λμνμ§ μκ³ νλ₯Ό μ¬μ©νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void search(Node root) {
Queue queue = new Queue();
root.marked = true;
queue.enqueue(root);
while (!queue.isEmpty()) {
Node r = queue.dequeue();
visit(r);
foreach (Node n in r.adjacent) {
if (n.marked == false) {
n.marked = true;
queue.enqueue(n);
}
}
}
}
μλ°©ν₯ νμ
μλ°©ν₯ νμμ μΆλ°μ§μ λμ°©μ§ μ¬μ΄μ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύμ λ μ¬μ©λκ³€ νλ€.
κΈ°λ³Έμ μΌλ‘ μΆλ°μ§μ λμ°©μ§ λ λ Έλμμ λμμ λλΉ μ°μ νμμ μνν λ€, λ νμ μ§μ μ΄ μΆ©λνλ κ²½μ°μ κ²½λ‘λ₯Ό μ°Ύλ λ°©μμ΄λ€.
λͺ¨λ λ Έλκ° μ μ΄λ kκ°μ μ΄μ λ Έλμ μ°κ²°λμ΄ μκ³ s β tλ‘μ μ΅λ¨ κ±°λ¦¬κ° dκ° λλ κ·Έλνλ₯Ό μκ°ν΄λ³΄μ.
- μ ν΅μ μΈ BFS μμλ λ 벨λ§λ€ k κ°μ λ
Έλλ₯Ό νμν΄μΌ νλ―λ‘ dλ² λ°λ³΅νλ©΄
O(K^d)
κ°μ λ Έλλ₯Ό νμνλ€. - μλ°©ν₯ νμμ μ¬μ©νλ€λ©΄ λλ΅
d/2
λ¨κ³κΉμ§ νμν ν μΆ©λνλ€. λ°λΌμ s μ t κ°κ°μμ λ°©λ¬Έν λ Έλλk^(d/2)
κ°κ° λ κ²μ΄κ³ μ 체 λ°©λ¬Έν λ Έλλ λλ΅2*k^(d/2)
κ°κ° λλ€.
μ¦, μλ°©ν₯ νμμ BFS λ³΄λ€ μ μ΄λ k^(d/2)
λ§νΌ λΉ λ₯΄λ€.
λ€λ₯Έ λ°©μμΌλ‘ λ§νλ©΄ 2λ°° λ κΈ΄ κ²½λ‘κΉμ§ μ°Ύμ μ μλ€!