[Data Structure] ๊ทธ๋ํ - ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ
๊ทธ๋ํ (Graph)
๊ทธ๋ํ๋ ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋น์ ํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
๐น์ ์ (V)
(vertex) - ๊ทธ๋ํ ๋ด์ ํ๋์ ๊ฐ๋ณ์ ์์
๐น๊ฐ์ (E)
(edge) - ์ ์ ๊ณผ ์ ์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ (ํ๋ฆ, ๊ด๊ณ ํํ)
๐น๊ฐ์ค์น(W)
(weight) - ๊ฐ์ ๊ณผ ์ ์ ์ฌ์ด์ ๋๋ ๋น์ฉ
๐น์ฐจ์
(degree) - ์ ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ์
โฝout-degree: ๋ค๋ฅธ ์ ์ ์ผ๋ก ๋๊ฐ๋ ๊ฐ์ (์)
โฝin-degree: ํน์ ์ ์ ์ผ๋ก ๋ค์ด์ค๋ ๊ฐ์ (์)
โฝ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ํ๋์ ๊ฐ์ ์ด ๋ ์ ์ ์ ์ธ์ ํ๋ฏ๋ก ๊ฐ์ ์์ ๋ ๋ฐฐ
๐ก ๋น์ ํ ์๋ฃ ๊ตฌ์กฐ
๋น์ ํ ์๋ฃ ๊ตฌ์กฐ๋ ์ผ๋ ฌ๋ก ๋์ดํ์ง ์๊ณ ์๋ฃ ์์๋ ๊ด๊ณ๊ฐ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ํธ๋ฆฌ๋ ๊ทธ๋ํ๋ฅผ ๋งํ๋ค.
๋ฐฉํฅ ๊ทธ๋ํ(Diredted Graph)
๊ทธ๋ํ์ ๊ฐ์ ์ด ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก์ ๋ฐฉํฅ์ ๊ฐ์ง
๊ทธ๋ํ์ ๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ทธ๋ํ
๊ฐ์ ์ ๋น์ฉ์ด๋ ๊ฐ์ค์น๊ฐ ํ ๋น๋ ๊ทธ๋ํ
๊ทธ๋ํ ๊ตฌํ
๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก๋ ํฌ๊ฒ ์ธ์ ๋ฆฌ์คํธ
์ ์ธ์ ํ๋ ฌ
์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋๋๋ค.
1๏ธโฃ์ธ์ ํ๋ ฌ(Adjacency Matrix)
์ ๋ฐฉ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ์ ์ ์ ๊ฐ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์์ด๋ค. ํ๋ ฌ์ ๊ฐ ์์(i,j)
๋ ์ ์ i
์ ์ ์ j
์ฌ์ด์ ๊ฐ์ ์ฌ๋ถ๋ฅผ ๋ํ๋ธ๋ค. ๋ณดํต 1์ธ ๊ฒฝ์ฐ๋ ๊ฐ์ ์ด ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๊ณ , 0์ธ ๊ฒฝ์ฐ๋ ๊ฐ์ ์ด ์์ด ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ฐ์ ์ ์๊ฐ ์ ์ ์ ์์ ๋นํด ๋ง์ ๊ทธ๋ํ์ ํจ๊ณผ์ ์ด๋ค. (๊ฐ์ ์ ์๊ฐ ์ ์ ๊ทธ๋ํ๋ฅผ ํํํ ๋์๋ ๋ญ๋น๋๋ ํ๋ ฌ์ ๊ณต๊ฐ์ด ๋ง์์ ธ ๋นํจ์จ์ ์ด๋ค.)
๐น์ ์ ์ ๊ฐ n
์ผ ๋, n*n
ํฌ๊ธฐ์ ํ๋ ฌ ํ์
๐น๊ฐ ํ๊ณผ ์ด์ ์ ์
์ ์๋ฏธ, ๊ฐ ์์ ๊ฐ๋ค์ ๊ฐ์
์ ์๋ฏธ
๐น๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๋ ๋์นญ ๊ตฌ์กฐ
๐น๊ฐ์ค์น ๊ทธ๋ํ๋ ๋ณดํต ๊ฐ์ค์น ๊ฐ ์ ์ฅ
๐ ์ฅ๋จ์
๋ ์ ์ ์ ๊ฐ์ ์กฐํ ์ O(1) ์ ์๊ฐ ์์
ํน์ ์ ์ i์ ์ฐจ์๋ฅผ ๊ตฌํ ๋ O(n) ์ ์๊ฐ ์์ (i๋ฒ์งธ ํ์ ๊ฐ์ ๋ชจ๋ ๋ํ์ฌ ๊ตฌํ ์ ์์)
๊ฐ์ ์์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด n*n ํฌ๊ธฐ์ ๋ฐฐ์ด ํ์ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ญ๋นํ ๊ฐ๋ฅ์ฑ ๋์
๊ทธ๋ํ์ ๋ชจ๋ ๊ฐ์ ์ ์ ์์๋ผ ๋ O(n^2) ์์
โ in java
package dataStructure;
public class ๊ทธ๋ํ_์ธ์ ํ๋ ฌ {
public static void main(String[] args) {
GraphAdjacencyMatrix graph = new GraphAdjacencyMatrix(4);
// ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ(์๋ฐฉํฅ ๊ทธ๋ํ) ๊ฐ์ ์ถ๊ฐ
graph.addEdge(1, 2, true);
graph.addEdge(2, 3, true);
graph.addEdge(2, 4, true);
graph.addEdge(3, 4, true);
// ๊ฐ์ ์กฐํ
System.out.println("Graph has edge between 1 and 2: " + graph.hasEdge(1, 2));
System.out.println("Graph has edge between 1 and 4: " + graph.hasEdge(1, 4));
graph.printGraph();
}
static class GraphAdjacencyMatrix {
private int[][] graph;
private int size;
public GraphAdjacencyMatrix(int size) {
// ํธ์์ +1 ํฌ๊ธฐ ๋ฐฐ์ด ์์ฑ
this.size = size;
this.graph = new int[size+1][size+1];
}
// ๊ฐ์ ์ถ๊ฐ
public void addEdge(int from, int to, boolean undirected) {
graph[from][to] = 1;
// ์๋ฐฉํฅ ๊ฐ์ ์ถ๊ฐ
if (undirected) {
graph[to][from] = 1;
}
}
// ๊ฐ์ ํ์ธ
public boolean hasEdge(int from, int to) {
return graph[from][to] == 1;
}
// ๊ทธ๋ํ ์ถ๋ ฅ
public void printGraph() {
for(int i = 1; i <= size; i++) {
for(int j = 1; j <= size; j++) {
System.out.print(" " + graph[i][j]);
}
System.out.println();
}
}
}
}
Graph has edge between 1 and 2: true
Graph has edge between 1 and 4: false
0 1 0 0
1 0 1 1
0 1 0 1
0 1 1 0
2๏ธโฃ์ธ์ ๋ฆฌ์คํธ(Adjacency List)
๊ทธ๋ํ์ ๊ฐ ์ ์ ๋ง๋ค ๊ทธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ ์ ๋ค์ ๋ชฉ๋ก์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. ๊ฐ ์ ์ ๋ง๋ค ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด๋ก ํํํ์ฌ ๊ทธ๋ํ์ ๊ตฌ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ํนํ, ์ ์ ์์ ๋นํด ๊ฐ์ ์๊ฐ ์ ์ ๊ทธ๋ํ์ ํจ๊ณผ์ ์ด๋ค.
๐น์ ์ ๊ฐ์๋งํผ ๋ฆฌ์คํธ ํ์
๐น๊ฐ ๋ฆฌ์คํธ์ ์ธ์ ํ ์ ์ ์ ์ ๋ณด ์ ์ฅ
๐น๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ๊ฐ์ ์ถ๊ฐ ์ ๊ฐ ์ ์ ์ ๋ฐ๋ ์ ์ ๋ฆฌ์คํธ์๋ ๋
ธ๋ ์ถ๊ฐ
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ฐ ์ ์ ๋ง๋ค ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ ์ ๋ค์ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ์ ์ฅํ๊ณ ์๋๋ฐ, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ผ๋ฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋นํด ์ผ๋ฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ตฌํ์ด ์ฉ์ดํ๋ค.
๐ ์ฅ๋จ์
์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ๋ค์ ์ ๋ณด(๊ฐ์ )๋ง ๊ด๋ฆฌํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ธก๋ฉด์์ ํจ์จ์
๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ ์กฐํํ๊ฑฐ๋ ์ ์ ์ ์ฐจ์๋ฅผ ์๊ธฐ ์ํด์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์
→ ์ ์ ์ ์ฐจ์๋งํผ์ ์๊ฐ ํ์ O(degree(v))
โ in java
package dataStructure;
import java.util.ArrayList;
public class ๊ทธ๋ํ_์ธ์ ๋ฆฌ์คํธ {
public static void main(String[] args) {
int numNodes = 4;
GraphAdjacencyList graph = new GraphAdjacencyList(numNodes);
graph.addEdge(2, 1, false);
graph.addEdge(2, 4, false);
graph.addEdge(3, 2, false);
graph.addEdge(4, 3, false);
// ์ ์ ๋ง๋ค ์ฐ๊ฒฐ๋ ์ ์ ๋ค ํ์ธ
for (int i = 1; i <= numNodes; i++) {
ArrayList<Integer> neighbors = graph.getAdjacentNodes(i);
System.out.println("Node " + i + " is adjacent to: " + neighbors);
}
}
static public class GraphAdjacencyList {
private int numNodes;
private ArrayList<ArrayList<Integer>> adjList;
// ์์ฑ์
public GraphAdjacencyList(int numNodes) {
// ๊ทธ๋ํ ์ ์ ์๋งํผ ๋ฆฌ์คํธ ์์ฑ
// ๋
ธ๋ ๋ฒํธ 1๋ถํฐ ์์ํ๊ธฐ ์ํด ํธ์์ + 1
this.numNodes = numNodes + 1;
adjList = new ArrayList<>(this.numNodes);
// ๊ฐ ๋
ธ๋๋ง๋ค ์ฐ๊ฒฐ ์ ๋ณด ์ ์ฅํ ๋ฆฌ์คํธ ์์ฑ
for (int i = 0; i <= numNodes; i++) {
adjList.add(new ArrayList<>());
}
}
// ๊ฐ์ ์ถ๊ฐ
public void addEdge(int u, int v, boolean undirected) {
adjList.get(u).add(v);
// ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ผ ๋
if(undirected){
adjList.get(v).add(u);
}
}
public ArrayList<Integer> getAdjacentNodes(int node) {
return adjList.get(node);
}
}
}
Node 1 is adjacent to: []
Node 2 is adjacent to: [1, 4]
Node 3 is adjacent to: [2]
Node 4 is adjacent to: [3]