V. Graph Basics, Heaps
- Graphs
- Implementation of Graphs
- Trees / Binary Trees
- Heaps
- Additional topics and Problems
- Programming Practice
์ ๋ฒ ์ธ์ ์ ์ด์ด์, ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถํ๊ณ ์ ํฉ๋๋ค.
Graphs
์ถ์์ ์ผ๋ก, ๊ทธ๋ํ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ $G = (V, E)$๋ฅผ ์๋ฏธํฉ๋๋ค.
-
$V$๋ ์ ์ ์ ์งํฉ์ผ๋ก, ๊ทธ๋ฅ ์์๋ค์ ๋ชจ์ ์งํฉ์ผ๋ก ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
-
$E$๋ $V \times V$์ ์ด๋ค ๋ถ๋ถ์งํฉ์ผ๋ก, ์์๋ค ๊ฐ์ ์ฐ๊ฒฐ์ฑ์ ํํํฉ๋๋ค.
์ฆ, ์ (์ ์ , ๋ ธ๋) ๋ค๊ณผ ๊ทธ๋ค ๊ฐ์ ์ฐ๊ฒฐ์ (๊ฐ์ , ์์ง) ๋ค์ configuration์ ๊ทธ๋ํ๋ผ๊ณ ์ ์ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ช๊ฐ์ง ์ฉ์ด๋ฅผ ์ง์๋ฉด...
-
Directed/Undirected graph : Directed graph๋ ๊ฐ์ $(u, v)$ ์ $(v, u)$ ๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณด๊ณ , Undirected graph๋ ๊ฐ์ง ์์ ๊ฒ์ผ๋ก ๋ด ๋๋ค.
-
Multigraph : $(u, v)_1$ ๊ณผ $(u, v)_2$๋ก, ๊ฐ์ ๊ฐ์ ์ด ์ฌ๋ฌ ๊ฐ ์์ ์ ์๋ - ์ฆ, $E$๊ฐ set์ด ์๋๋ผ multiset์ธ - ๊ทธ๋ํ๋ฅผ ๋งํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๊ณ ๋ คํ์ง ์์ ๊ฒ์ ๋๋ค.
-
Simple graph : $E$๊ฐ ์ค๋ณต์ ํ์ฉํ์ง ์์ ๋ฟ ์๋๋ผ, $(u, u)$ ๋ ํ์ฉํ์ง ์๋ ๊ทธ๋ํ๋ฅผ ๋งํฉ๋๋ค.
-
Path : ๊ฐ์ ๋ค์ ๋ฐ๋ผ ๋ ์ ์๋ โ๊ฒฝ๋กโ ๋ฅผ ๋งํฉ๋๋ค.
-
Circuit / Cycle : Path์ ์์์ ์ด ๋์ ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค.
-
Adjacent : ์ ์ $u, v$์ ๋ํด, $(u, v) \in E$ ์ด๋ฉด adjacent๋ผ๊ณ ๋งํฉ๋๋ค. ๋ํ $u, v$๋ ์๋ก์ neighbor์ ๋๋ค.
-
Connected Component : ์ ์ $u, v$์ ๋ํด, $u$์์ ์์ํด์ $v$์ ๋์ฐฉํ๋ path๊ฐ ์กด์ฌํ๋ฉด ๊ฐ์ connected component์ ์๋ค๊ณ ๋งํฉ๋๋ค. ํนํ ๋ชจ๋ ์ ์ ์ด ํ๋์ connected component๋ฅผ ์ด๋ฃจ๋ฉด connected graph๋ผ๊ณ ๋งํฉ๋๋ค.
Unless otherwise specified, $V$๋ ์ ์ ์ ์งํฉ์ด๋ฉด์ ๊ฐํน ์ ์ ์ ๊ฐ์๋ฅผ $V$๊ฐ๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ ๋๋ค. $E$๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. (Abuse of notation) ๋ํ, ์์ผ๋ก ๊ทธ๋ฅ ๊ทธ๋ํ $G$๋ผ๊ณ ํ๋ฉด $n$๊ฐ์ ์ ์ ๊ณผ $m$๊ฐ์ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง Undirected Connected Simple Graph๋ฅผ ์๊ฐํ๊ฒ ์ต๋๋ค. ๊ทธ๋ํ์ ๋ํ ๋ง์ ๋ ผ์ฆ์ ๊ฐ Connected Component๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์๊ฐํ ์ ์์ผ๋ฉฐ, Multigraph๋ ๋์ถฉ ๋น์ทํ๊ฒ ๋ค๋ฃจ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Implementation of Graphs
๊ทธ๋ํ์ ๋ํด์๋ ํ์ ๋ค์ ์์ธํ ๋ณด๊ฒ ์ง๋ง, ์ฌ๊ธฐ์๋ ๊ทธ๋ํ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ง๋ง ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
ํํ ์ฌ์ฉํ๋ ๊ทธ๋ํ ๊ตฌํ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
-
Adjacent matrix : 2์ฐจ์ $n \times n$ ๋ฐฐ์ด์ ์ก๊ณ , $A_{ij}$ ๋ฅผ $(i, j)$ ๊ฐ์ ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๊ฒ์ ๋๋ค. Directed graph๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ์กฐ๊ธ ๋ ์์ฐ์ค๋ฝ๊ณ , Undirected graph์ผ ๋๋ $A$๊ฐ ๋์นญํ๋ ฌ์ด ๋ ๊ฒ์ ๋๋ค.
์ด๋ก ์ ์ผ๋ก ์ด ๋ฐฉ๋ฒ์ด ์กฐ๊ธ๋ ์์ฐ์ค๋ฝ๊ฒ ๊ทธ๋ํ๋ฅผ ๋ํ ์ ์๋๋ฐ, ํนํ Adjacency matrix $A$์ ์ ํ๋์ํ์ ์ฑ์ง๋ก๋ถํฐ (Eigenvalue ๋ฑ) ๊ทธ๋ํ์ ์ฑ์ง์ ์ ์ ์๋ ๊ฒ๋ค์ด ๋ง์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
Adjacent list : Vector๋ List๊ฐ์ ๋ค์ด๋๋ฏนํ ๋ญ๊ฐ๋ฅผ ์ ์ ๋ง๋ค ํ๋์ฉ $n$๊ฐ ์ก๊ณ , โ์ด ์ ์ ์ ์ธ์ ํ ์ ์ โ ๋ค์ ๋ฆฌ์คํธ (๋ฐฐ์ด) ์ ๊ด๋ฆฌํ๋ ๊ด์ ์ ๋๋ค.
๊ทธ๋ํ์ Density์ ๋ํด ์๊ฐํด ๋ด ์๋ค. ์ผ์์์ ๋ง๋๋ ๋๋ถ๋ถ์ (ํฐ) ๊ทธ๋ํ๋ค์, ๊ต์ฅํ sparseํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ด์ค๋ถ ์ ์ฒด์ ์น๊ตฌ ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ฆฐ๋ค๋ฉด, ํ์ด์ค๋ถ ์ ์ 10์ต ๋ช ์ค ์ฌ๋ฌ๋ถ์ ํ์น์ ๋ง์์ผ ์ฒ ๋ช ๋จ์์ผ ๊ฒ์ด๋ฏ๋ก ์ ์ฒด ๊ฐ๋ฅํ ๊ฐ์ ๋ค ์ค 100๋ง ๋ถ์ 1 ์ ๋๋ฐ์ ์ฌ์ฉ๋์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค. ๋์ถฉ ๊ฐ์ ์ด $n^2$๊ฐ ๊ทผ์ฒ์ผ ๋ dense, ๊ทธ๋ณด๋ค ๋ง์ด ์์ผ๋ฉด sparse๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.
Adjacent matrix๊ฐ ์ด๋ก ์ ์ผ๋ก ๋ณด๋ค ์๋ฆ๋ต๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ๊ทธ๋ํ๊ฐ sparseํ ๋ adjacent matrix๋ $O(n^2)$ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๋ค๋ ์ฌ๊ฐํ ๋จ์ ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ง์ ๊ฒฝ์ฐ์ sparseํ ๊ทธ๋ํ๋ฅผ ๋ค๋ฃจ๊ณ ์ถ๊ณ , ๊ฐ์ ์ ๋ฐ๋ผ๊ฐ๋ฉด์ ์์ ์ ํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด...
for (int nxt = 0; nxt < n; nxt++)
if (A[i][nxt])
traverse(A[i][nxt]);
for (int j = 0; j < A[i].size(); j++)
traverse(A[i][j]);
์ด ์ฝ๋๋ ๋ ๋ค $i$์ neighbor๋ค์ ๋๋ฉด์ traverseํจ์๋ฅผ ํธ์ถํ์ง๋ง, ์ ์์ ๊ฒฝ์ฐ์๋ if๋ฌธ์ด ์ถ๊ฐ๋ ๋ฟ ์๋๋ผ $O(n)$ ๊ฐ๋งํผ ํ์ธํด์ผ ํฉ๋๋ค. ๋ง์ฝ ํ์ด์ค๋ถ ์น๊ตฌ ๊ทธ๋ํ์ ๋ํด ์ฝ๋๋ฅผ ๋๋ฆฌ๋ฉด, ์์ชฝ ๊ฒฝ์ฐ์๋ ๋ด ์น๊ตฌ๋ค์ ์ฐพ๊ธฐ ์ํด 10์ต๋ช ์ ๋ชจ๋ ์ ์ ๋ฅผ ํ์ํ๋ ๋ฐ๋ฉด ํ์๋ ๊ทธ๋ฐ ํ์๊ฐ ์์ต๋๋ค.
๋ค๋ง ์ธ์ ํ๋ ฌ์ด ๊ตฌํ์ด ์ข๋ ๊ฐ๋จํ๊ณ , ํ๋ ฌ ๊ณฑ์ ์ ํตํด ์ฐ๊ฒฐ์ฑ์ ๋ณธ๋ค๋๊ฐ ํ๋ ์ฐ์ฐ๋ค์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ํ์ํ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด์ ๋ค ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๊ทธ๋ํ์ ๊ธฐ๋ณธ ํํ์ผ๋ก ๋ณด๊ฒ ์ต๋๋ค.
Trees / Binary Trees
์ ์ $n$๊ฐ ์ค ์ด๋ค ๋ฃจํธ๊ฐ ์๊ณ , ๋ฃจํธ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ๊น์ง์ ๊ฒฝ๋ก๊ฐ ์ ์ผํ๊ฒ ์กด์ฌํ๋ ๊ทธ๋ํ๋ฅผ Tree๋ผ๊ณ ํฉ๋๋ค. ์ด๋ ๋ฃจํธ๋ก๋ถํฐ ๊ฒฝ๋ก๋ฅผ ๋ด๋ ธ์ ๋ ๋ด ๋ฐ๋ก ์ด์ ๋ ธ๋๋ฅผ parent, ๊ทธ ์ด์ ๋ ธ๋๋ค์ ancestor๋ผ๊ณ ํฉ๋๋ค (๋ฐ๋๋ child, descendant) ํธ๋ฆฌ์ ๊ฒฝ์ฐ, ์ธ์ ๋ฆฌ์คํธ ํํ ์ธ์๋ ๊ทธ๋ฅ $n$์นธ ๋ฐฐ์ด์ ๊ฐ tree์ parent node๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ์ฅํ ์ ์์ต๋๋ค.
Binary Tree๋, ๋ชจ๋ ๋ ธ๋์ Child node๊ฐ ์ต๋ 2๊ฐ์ธ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ตฌํ์ ํธ์์, ๋ค์ํ ํ์ฉ์ฒ ๋๋ฌธ์ ๋งค์ฐ ์์ฃผ ํ์ฉ๋๋ ์๋ฃ ๊ตฌ์กฐ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์์ผ๋ก Binary tree ๋ ธ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ๊ฒ์ ๋๋ค.
struct node {
int val, id;
node * left;
node * right;
} root;
์ฆ, ๊ฐ ๋ ธ๋๊ฐ id์ ์ด๋ค ๊ฐ์ ํ๋ ๊ฐ์ง๊ณ ์๊ณ , ์์ ์ left / right child๋ก ๊ฐ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
์ด์ง ํธ๋ฆฌ์ Special case๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
-
Full Binary Tree : ๋ชจ๋ ๋ ธ๋๊ฐ 0๊ฐ ๋๋ 2๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ต๋๋ค.
-
Complete Binary Tree : ๊ฐ์ฅ ์๋ ์ธต์ ์ ์ธํ ๋ชจ๋ ์ธต์ด ์ต๋ํ ๋ ธ๋๊ฐ ์ฐจ ์๊ณ , ๊ฐ์ฅ ์๋ ์ธต์์๋ ์ต๋ํ ์ผ์ชฝ์ผ๋ก ๋ ธ๋๊ฐ ๋ชฐ๋ ค์๋ ํธ๋ฆฌ์ ๋๋ค.
-
Perfect Binary Tree : Complete ์ด๋ฉด์ Full ์ธ binary tree์ ๋๋ค. ๋์ด๊ฐ $h$์ธ Perfect Binary Tree์ ๋ ธ๋๋ ํญ์ $2^h$์์ ๊ธฐ์ตํ์ธ์.
์ผ๋ฐ์ ์ผ๋ก, Balance๊ฐ ์ ์กํ ์๋ binary tree๋ ๋์ด๊ฐ $\log n$ ์ ๋์ด๊ณ , ํ ์ค์ ๊ฐ๊น์ด binary tree๋ ๋์ด๊ฐ $n$ ์ ๋์์ ๊ธฐ์ตํ๋ฉด ์ข์ต๋๋ค.
Heaps
Heap์ด๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋, ๋ค์๊ณผ ๊ฐ์ ์ฑ์ง์ ๋ง์กฑํ๋ ํธ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
-
Complete Binary Tree. ์ฆ, ์ต๋ํ ๊ท ํ์ด ์กํ ์๊ณ , ๋ ธ๋๊ฐ ๋จ๋๋ค๋ฉด ์ผ์ชฝ์ผ๋ก ๋ชฐ์๋ฃ์ ์ํ์ ํธ๋ฆฌ์ฌ์ผ ํฉ๋๋ค.
-
ํ ์ฑ์ง. ๋ถ๋ชจ ๋ ธ๋์ ์ฐ์ฌ ์๋ ๊ฐ์, ์์ ๋ ธ๋์ ์ฐ์ฌ ์๋ ๊ฐ๋ณด๋ค ํญ์ ์๊ฑฐ๋ ๊ฐ๋ค.
์ด์ , Complete Binary Tree์ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด ๋ณด๋ฉด, ํ ์ธต์ฉ ๋ฐ์ผ๋ก ๋ด๋ ค์ฌ ๋๋ง๋ค ๋ ธ๋์ ๊ฐ์๊ฐ 2๋ฐฐ์ฉ ๋์ด๋๋ฏ๋ก, ์ ์ฒด ๋ ธ๋์ ๊ฐ์๊ฐ $n$๊ฐ ์ ๋์ผ ๋, ๋์ด $h$ ๋ $h \in \Theta(\log n)$ ์ ๋๋ค. ๋ํ, Heap์ ์ฑ์ง ์, Heap์ ์์์ ๋ ธ๋๋ฅผ ํ๋ ์ก์ผ๋ฉด, ๊ทธ ๋ ธ๋๋ฅผ root๋ก ํ๋ subtree๋ ๋ค์ heap์์ ์ ์ ์์ต๋๋ค.
Heap Operation
Heap์ ๊ธฐ๋ณธ operation์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ๋๊ฐ์ง ์ฐ์ฐ์ ์๊ฐํฉ๋๋ค.
-
Heap์ ์ด๋ค ์ $x$๋ฅผ ์ฝ์ ํ๋ Push ์ฐ์ฐ
-
Heap์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ
Pop ์ฐ์ฐ์์ ๋ฃจํธ๋ง ์๊ฐํด๋ ๋๋ ์ด์ ๋ ์์ ๋งํ ๋ฐ์ ๊ฐ์ด, ๋ชจ๋
๋
ธ๋๊ฐ ์์ ์ subtree๋ก ํ๋ heap์ ๋ฃจํธ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์, ์ ๋
์ฐ์ฐ๋ง ์์ผ๋ฉด Heap์ ์์์ ์์๋ฅผ ์ฝ์
ํ๊ณ ์ญ์ ํ ์ ์๋ค๋
์๋ฏธ์
๋๋ค.
์ด ์ฐ์ฐ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ์๊ฐํด ๋ด
์๋ค. Push์ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์
๊ณผ์ ์ผ๋ก ์ํํฉ๋๋ค.
-
๋ฌด์กฐ๊ฑด ์์ ์ด์ง ํธ๋ฆฌ ์ฑ์ง์ ๋ง์กฑํ๋ ๊ฒ์ ์ฐ์ ํ์ฌ, ๋ ์๋ฆฌ์ ์ฝ์ ํฉ๋๋ค.
-
๋์๋ฆฌ์ ์ฝ์ ์ผ๋ก ์ธํด ํ ์ฑ์ง์ด ๊นจ์ก์ ์ ์์ผ๋ฏ๋ก, ๊ทธ ์๋ฆฌ๋ถํฐ ์ฌ๋ผ์ค๋ฉด์ ํ์ ์์ ํฉ๋๋ค.
ํ์ ์์ ํ๋ค๊ณ ํ๋ ๋ง์, ์ค์ ๋ก๋ ์ฝ์
ํ ์๋ฆฌ๋ถํฐ ์ฌ๋ผ์ค๊ฑฐ๋
๋ด๋ ค๊ฐ๋ฉด์, ์์ ๋
ธ๋๊ฐ ๋ถ๋ชจ ๋
ธ๋๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ก์ผ๋ฉด ๋ ๋
ธ๋๋ฅผ
๊ตํํ๋ค๋ ์๋ฏธ์
๋๋ค. ์์ผ๋ก ์ด์ ๊ฐ์ โํ ์์ โ ์ด๋ผ๋ ๋ง์ ๊ณ์ ์ธ
ํ
๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ํน์ ๋
ธ๋์์ ํ์ ์์ ํ๋ค๋ฉด, ๋ฃจํธ๋ถํฐ ๋ฆฌํ๊น์ง
๋ด๋ ค๊ฐ๋ฉด์ ๋งค ๋จ๊ณ ์ต๋ 2๊ฐ์ฉ, ๋ง์์ผ $2h \in O(\log n)$ ๊ฐ์ ๋
ธ๋๋ง
๋ณด๋ฉด ๋ฉ๋๋ค.
ํ์์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
์์ ์ด์ง ํธ๋ฆฌ ์ฑ์ง์ ๋ง์กฑํ๋ ๊ฒ์ ์ฐ์ ํ์ฌ, ๋ ์๋ฆฌ ๋ ธ๋์ ์ญ์ ํ ๋ ธ๋์ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ๋๋ค.
-
๋ ์๋ฆฌ์ ๋ ธ๋๋ฅผ ์ง์๋ ์์ ์ด์ง ํธ๋ฆฌ ์ฑ์ง์ด ๊นจ์ง์ง ์์ต๋๋ค.
-
์ด์ , ๋ฐฉ๊ธ ๊ตํ์ ์ํด ํ ์ฑ์ง์ด ๊นจ์ก์ ์ ์์ผ๋ฏ๋ก, ์์๋๋ก ์ค๊ฐ๋ฉด์ ํ์ ์์ ํฉ๋๋ค.
๊ณผ์ ์ ๋ณด๋ฉด, ์์ ์ธ์ ๋ชจ๋ Operation์ ๊ตฌํ์ ์ ํ๋ฉด $O(1)$์ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์ ๋ณด์ ๋๋ค. ์์ ์์๋ ๊ฐ ๊ฐ์ ๋น๊ต๊ฐ ์ต๋ $O(\log n)$ ๋ฒ ์ผ์ด๋๊ธฐ ๋๋ฌธ์, ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ์ $O(\log n)$ ์ ๋๋ค.
Heap Sort
๋น Heap๊ณผ $n$ ํฌ๊ธฐ์ ๋ฐฐ์ด์์ ์์ํด์, ๋ชจ๋ element๋ฅผ Heap์ ๋ฃ์ต๋๋ค. ๊ทธ๋ค์, ๋ฃจํธ๊ฐ ์ ์ฒด heap์ ์ต์๊ฐ์ด๋ฏ๋ก, ๋ฃจํธ๋ฅผ ํ์ธํ๊ณ ์ญ์ ํ๋ ์ฐ์ฐ์ $n$๋ฒ ๋ฐ๋ณตํ๋ฉด, ์์ ์์๋ถํฐ ์์๋๋ก ๋์ค๊ฒ ๋ฉ๋๋ค. ๋ฃ๊ณ ๋นผ๋๋ฐ ๋งค๋ฒ $O(\log n)$์ฉ์ด๋ฏ๋ก ํญ์ $O(n \log n)$ ์ ๋ ฌ์์ด ๋ณด์ฅ๋ฉ๋๋ค!
Heap Implementation
ํ์ด ํธ๋ฆฌ ๊ตฌ์กฐ๋ผ๊ณ ํด์, ์ค์ ๋ก ํฌ์ธํฐ ์ธ๊ฐ์ง๋ฆฌ ๋ ธ๋๋ก (Parent, Left-Child, Right-Child) ๊ตฌํํด์ผ ํ ํ์๋ ์์ต๋๋ค. ์ค์ ๋ก๋, ๋ค์๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ๋ฐฐ์ด์ ํธ๋ฆฌ๋ฅผ ์น๋ ๋๋์ผ๋ก ๊ตฌํํ๋ฉด ์ ์ฉํฉ๋๋ค.
-
1๋ฒ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ํ๋ค.
-
$n$๋ฒ ๋ ธ๋์ ๋ ์์ ๋ ธ๋๋ $2n$, $2n+1$๋ฒ์ผ๋ก ํ๋ค.
-
๊ทธ๋ฌ๋ฉด, ์๋์ผ๋ก $n$๋ฒ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ $n/2$๋ฒ ๋ ธ๋ (์ ์ ๋๋์ ๋ง ํ๋ฉด ๋ฐ๋ก ๋์ต๋๋ค!).
์ด โ๋ฐฐ์ด์ ์ด์งํธ๋ฆฌ๋ฅผ ์น๋โ ๊ตฌํ์ ๋์ค์ ์ด์งํธ๋ฆฌ ๊ธฐ๋ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ๋ ์ ๋ง ๋ง์ด ์ฐ๊ฒ ๋ฉ๋๋ค.
Additional topics and Problems
-
Heap sort์์๋ ์ด์ฐจํผ ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง์ง ์์์ ๋น ํ์ $n$๊ฐ์ ์์๋ฅผ ์์๋๋ก ์ฝ์ ํ๋ ์์ผ๋ก ํ์ ๊ตฌ์ฑํ์ง๋ง, ์ค์ ๋ก๋ ์ด๋ฏธ ์๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก Heap์ผ๋ก ๋ง๋๋ Heapify() ์ฐ์ฐ์ ์ด๋ณด๋ค ๋นจ๋ฆฌ ํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ์ด์ฉํฉ๋๋ค.
-
๊ฐ์ฅ ์๋ ๋ ธ๋ ($N$๋ฒ) ๋ถํฐ ์์ํฉ๋๋ค.
-
์์ ์ ๊ฐ์ด ๋ถ๋ชจ๋ ธ๋๋ณด๋ค ๋๋ค๋ฉด, ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ ๊ตํํฉ๋๋ค.
-
์ด๋์ ๊ฐ์ด ์์ ์ ์ ๋ณด๋ค ์๋ค๋ฉด, ์์๋ ธ๋ ์ค ์์ ์ชฝ๊ณผ ๊ฐ์ ๊ตํํฉ๋๋ค. (๋ฆฌํ๊น์ง ๋ด๋ ค๊ฐ๋ฉด์)
-
์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํฉ๋๋ค.
Heap ์์ ๊ณผ์ ๊ณผ ๋๊ฐ์ ๋ณด์ด์ง๋ง, ์ฝ๊ฐ์ ์ฐจ์ด๋ ์์ชฝ์ผ๋ก๋ ๋๊น์ง ํ์ธํ์ง ์๋๋ค๋ ์ ์ ๋๋ค. ์๋์ชฝ์ผ๋ก๋ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํด์ผ ํ์ง๋ง, ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ ๊ตํํ๋ค๊ณ ํด์ ํ๋ฒ์ ์์ชฝ๊น์ง ํ์ ์์ ํ์ง ๋ง๊ณ , ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ ๋์ค์ ๊ทธ ๋ ธ๋ ์ฐจ๋ก๊ฐ ๋ ๋ ํ์ธํด๋ ๋ฉ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์๊ฐํด ๋ณด๋ฉด, ์์ ์ ๋์ด์ ๋น๋กํ๋ ์ ๋์ ์ฐ์ฐ์ด ํ์ํจ์ ์ ์ ์์ต๋๋ค. ๋๋ต ๊ฐ ๋ ธ๋๋ง๋ค ๋์ด๊ฐ $h$๋ผ๋ฉด ๋๋ต $O(h)$๋ฒ ์ฐ์ฐ์ด ํ์ํฉ๋๋ค. ๋์ด๊ฐ $k$์ธ ๋ ธ๋๊ฐ $2^k$๊ฐ์์ ์ด์ฉํ์ฌ, ์ด ์๊ณ ๋ฆฌ์ฆ์ด ์ฃผ์ด์ง Array๋ฅผ Heap์ผ๋ก ๊ณ ์น๋ ๋ฐ $O(n)$ ์๊ฐ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์์ ๋ณด์ด์ธ์.ํํธ) ๊ฐ ๋ ธ๋๋ โ์ต๋ ์ผ๋ง๋โ ๋ด๋ ค๊ฐ ์ ์๋์?
-
Programming Practice
-
BOJ 19535๋ฒ์ ํด๊ฒฐํด ๋ณด์ธ์.
-
BOJ 11279๋ฒ์ (STL์ priority queue๋ฅผ ์ฐ์ง ๋ง๊ณ ) ํด๊ฒฐํด ๋ณด์ธ์.
-
BOJ 1655๋ฒ์ ํด๊ฒฐํด ๋ณด์ธ์.