ํธ๋ผ์ด(Trie)
ํค์ ๊ฐ์ ์์ผ๋ก ๊ฐ๋ ์ฐ๊ด ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํธ๋ฆฌ ์๋ฃ ๊ตฌ์กฐ
์ฃผ๋ก ์์ฐ์ด ์ฒ๋ฆฌ(NLP) ๋ถ์ผ์์ ๋ฌธ์์ด ํ์์ ์ํด ์ฌ์ฉํ๋ค. ๋ฌธ์์ด์ ๊ฐ๊ฐ์ ๋ฌธ์ ๋จ์๋ก ์์ธ์ ๊ตฌ์ถํ ํํ์ด๋ค.
ํธ๋ผ์ด ์๋ฆฌ
ํธ๋ผ์ด๋ฅผ ์ด์ฉํ ๋ฌธ์์ด ์ ์ฅ
- ๊ฐ ๋ ธ๋๊ฐ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- ์ ์ฅํ๋ ค๋ ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์๋ค์ ํ์ธํ๋ฉฐ ์๋ ๊ณผ์ ์ ์ํํ๋ค.
- ๋ฃจํธ ๋ ธ๋(๋ฌธ์ ๋ฐฐ์ด)์์ ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ๋ฌธ์์ ํด๋นํ๋ ์ธ๋ฑ์ค๋ก ์ด๋ํ๋ค.
- ํด๋น ์ธ๋ฑ์ค์ ์ฐ๊ฒฐ๋ ์์ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์๋ก์ด ๋ ธ๋(๋ฌธ์ ๋ฐฐ์ด)๋ฅผ ํ ๋นํ๋ค. ์ดํ ์๋ก์ด ๋ ธ๋์์ ๋๋ฒ์งธ ๋ฌธ์์ ํด๋นํ๋ ์ธ๋ฑ์ค๋ก ์ด๋ํ๋ค.
- ํด๋น ์ธ๋ฑ์ค์ ์ฐ๊ฒฐ๋ ์์ ๋ ธ๋๊ฐ ์กด์ฌํ๋ค๋ฉด ํด๋น ๋ ธ๋์ ๋๋ฒ์งธ ๋ฌธ์์ ํด๋นํ๋ ์ธ๋ฑ์ค๋ก ์ด๋ํ๋ค.
- ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ค ์ ์ฅํ ๋๊น์ง(์ฆ, ๋ฌธ์์ด ๊ธธ์ด๋งํผ) ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ๋์๋ ๋ฐฐ์ด ๊ฐ์
true
๋ก ์ค์ ํ์ฌ ํ๋์ ๋ฌธ์์ด์ด ์์ ํ ์ ์ฅ๋จ์ ํ์ํ๋ค.
์์ ๊ณผ์ ์์ ์ฃผ๋ชฉํ ์ ์ ์ ๋์ฌ๊ฐ ๋์ผํ ๋ฌธ์์ด์ ์ ์ฅํ ๊ฒฝ์ฐ ์ต์ ํ๋ ์ด์์ ๋ ธ๋๋ฅผ ๊ณต์ ํ๋ค๋ ๊ฒ์ด๋ค!
ํธ๋ผ์ด์ ์๊ฐ ๋ณต์ก๋
์์ ๋ฐฉ์๋๋ก ๋ฌธ์์ด์ ์ ์ฅํ ๊ฒฝ์ฐ ํ ๋ฌธ์์ด์ ํ์ํ ๋ ๊ณ ์ O(1)
์ ์ฐ์ฐ๋ง ํ์ํ๊ฒ ๋๋ค.
์๋ฌด๋ฆฌ ํธ๋ฆฌ ๋
ธ๋๊ฐ ๋ง์ด ์กด์ฌํ๋๋ผ๋, ์ฌ์ง์ด๋ ์ ์ธ๊ณ ๋ชจ๋ ์ธ๊ตฌ์ธ 80์ต๋ช
์ ์ด๋ฆ์ด ์ ์ฅ๋ ํธ๋ผ์ด๋ผ๊ณ ํ ์ง๋ผ๋, ์ค์ง O(1)
์ ์๊ฐ๋ง์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ ์ด์ ๋ ํ ๋ฌธ์์ด์ ํ์ํ๊ธฐ ์ํด์๋ ํด๋น ๋ฌธ์์ด์ด ๊ฐ๊ณ ์๋ ๋ฌธ์ ๋
ธ๋๋ง์ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฃจํธ ๋
ธ๋์์๋ถํฐ ํด๋น ๋ฌธ์์ด์ ๊ธธ์ด ๋งํผ์ ์์ ๋
ธ๋๋ง ํ๊ณ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌ๋ฆฌ ์ ์ฅ๋ ๋ฌธ์์ด์ ๊ฐ์์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ ์ ์ด ํธ๋ผ์ด์ ํฐ ํน์ฅ์ ์ด๋ค.
ํธ๋ผ์ด์ ๊ณต๊ฐ ๋ณต์ก๋
์ฐ์ํ ์๊ฐ์ ์ฑ๋ฅ์ ์๋ํ๋ ํธ๋ผ์ด์ ์น๋ช ์ ์ธ ํ๊ณ๋ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
ํธ๋ผ์ด๋ฅผ ์ด์ฉํด ํ๊ตญ์ 5์ฒ๋ง ์ธ๊ตฌ์ ์ด๋ฆ์ ์ ์ฅํ๋ค๊ณ ์๊ฐํด๋ณด์. ํ๊ตญ์์ ๊ฐ์ฅ ๊ธด ์ด๋ฆ์ "๋ฐํ๋๋ณ๋๊ตฌ๋ฆํ๋๋ณด๋ค์ฌ๋์ค๋ฌ์ฐ๋ฆฌ"
๋ก 17์์ด๋ค. ์ด ์ด๋ฆ์ ์ ์ฅํ๊ธฐ ์ํด์๋ ํ๊ธ์ ๋ชจ๋ ์์ ์ ๋ฐฐ์ด๋ก ๋ด์, ๊ธธ์ด๊ฐ 11,172์ธ ๋ฐฐ์ด
์ด 17๊ฐ
๊ฐ ํ์ํ๊ณ ์ด 189,924
๋งํผ์ ๋ฉ๋ชจ๋ฆฌ(1์์ ์ 1byte๋ก ๊ฐ์ )๊ฐ ํ์ํ๋ค. ์ด๋ฆ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ ์๊ธด ๋ฌธ์ ๋ผ๊ณ ๋งํ ์๋ ์๊ฒ ์ง๋ง, ๊ฐ์ฅ ๋ณดํธ์ ์ธ 3์ ์ด๋ฆ ์ญ์ 11,172์ธ ๋ฐฐ์ด
์ด 3๊ฐ
๊ฐ ํ์ํ๊ณ ์ด 33,516
๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค. ํ ๋ช
์ ์ด๋ฆ์ ์ ์ฅํ๋๋ฐ๋ ์ด๋ ๊ฒ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ฐ ๋ฐฉ์์ผ๋ก 5์ฒ๋ง
๋ช
์ ์ด๋ฆ์ ์ ์ฅํ๋ค๋ฉด ์ด๋ง์ด๋งํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.(๋ฌผ๋ก ๊ฐ์ ์ฑ์ ์ฌ์ฉํ๊ฑฐ๋ ๋๋ฆผ์๋ฅผ ์ฌ์ฉํ๋ ์ด๋ฆ์ ๋
ธ๋๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ด ์กฐ๊ธ์ ํจ์จ์ ์ด๋ผ๊ณ ๋งํ ์ ์๋ค.)
ํธ๋ผ์ด์ ๊ณต๊ฐ ๋ณต์ก๋๋ ๋๋ต O(ํฌ์ธํฐ ํฌ๊ธฐ * ํฌ์ธํฐ ๋ฐฐ์ด์ ๊ธธ์ด * ์ ์ฒด ๋
ธ๋ ๊ฐ์)
๊ฐ ๋๋ค. ๋ฐ๋ผ์ ํธ๋ผ์ด๋ ์๊ฐ์ ์ฑ๋ฅ๊ณผ ๊ณต๊ฐ์ ์ฑ๋ฅ์ ๋ง๋ฐ๊พผ ๋ํ์ ์ธ ์๋ก ๋ณผ ์ ์๋ค.
Java๋ฅผ ์ด์ฉํ ํธ๋ผ์ด ๊ตฌํ
class Trie {
final int ALPHABET_SIZE = 26; // ํฌ์ธํฐ ๋ฐฐ์ด์ ๊ธธ์ด(ํํํ ์ ์๋ ๋ฌธ์ ๊ฐ์)
class Node {
Node[] children = new Node[ALPHABET_SIZE];
boolean isEndOfWord; // ์ ์ฅํ๋ ค๋ ๋ฌธ์์ด์ ๋ง์ง๋ง ๋ฌธ์ ์ฌ๋ถ
public Node() {
for (int i=0; i<ALPHABET_SIZE; i++) {
children[i] = null; // ํฌ์ธํฐ ๋ฐฐ์ด ์ด๊ธฐํ
}
isEndOfWord = false; // ๋ง์ง๋ง ๋ฌธ์ ์ฌ๋ถ ์ด๊ธฐํ
}
}
Node root; // ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ๋ฌธ์
public void insert(String key) {
int length = key.length(); // ํ์ํ๋ ค๋ ๋ฌธ์์ด ๊ธธ์ด
int alphabetIdx; // ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ์ธ๋ฑ์ค
Node curAlphabet = root; // ํ์ฌ ํ์์ค์ธ ๋ฌธ์์ด์ ๋ฌธ์
for (int level=0; level<length; level++) {
alphabetIdx = key.charAt(level) - 'a'; // ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ์ธ๋ฑ์ค ๊ตฌํ๊ธฐ
Node nextAlphabet = curAlphabet.children[alphabetIdx]; // ๋ฌธ์์ด์ ๋ค์ ๋ฌธ์
if (nextAlphabet == null) { // ์ฐพ์ผ๋ ค๋ ๋ฌธ์์ ์ฐ๊ฒฐ๋ ์์ ๋
ธ๋๊ฐ ์์ ๊ฒฝ์ฐ
nextAlphabet = new Node(); // ์๋ก์ด ๋
ธ๋ ์์ฑ ๋ค ์์ ๋
ธ๋๋ก ์ฐ๊ฒฐ
}
curAlphabet = nextAlphabet; // ์ฐพ์ผ๋ ค๋ ๋ฌธ์์ ์์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก
}
curAlphabet.isEndOfWord = true; // ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์์ ๋ํด ์ฝ์
์ด ๋๋ฌ๋ค๋ฉด ๋ง์ง๋ง ๋ฌธ์์ ๋
ธ๋๋ true๋ก ๋ณ๊ฒฝํ์ฌ ํ๋์ ๋ฌธ์์ด์ด ์ ์ฅ๋์์ ํ์
}
public boolean search(String key) {
int length = key.length(); // ํ์ํ๋ ค๋ ๋ฌธ์์ด ๊ธธ์ด
int alphabetIdx; // ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ์ธ๋ฑ์ค
Node curAlphabet = root; // ํ์ฌ ํ์์ค์ธ ๋ฌธ์์ด์ ๋ฌธ์
for (int level=0; level<length; level++) {
alphabetIdx = key.charAt(level) - 'a';
Node nextAlphabet = curAlphabet.children[alphabetIdx];
if (nextAlphabet == null) { // ํ์ํ๋ ค๋ ๋ฌธ์์ด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
return false;
}
curAlphabet = nextAlphabet; // ์ฐพ์ผ๋ ค๋ ๋ฌธ์์ ์์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก
}
return (curAlphabet.isEndOfWord); // ํ์ํ๋ ค๋ ๋ฌธ์์ด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ
}
}
ํธ๋ผ์ด์ ๋งต์ ์ฐจ์ด
- ํธ๋ผ์ด๋ ์ ๋ ฌ์ ์ง์ํ๋ค. (ํธ๋ฆฌ๋งต์ ์ ๋ ฌ์ ์ง์ํ์ง๋ง ํด์๋งต์ ์ง์ํ์ง ์์)
- ํธ๋ผ์ด๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค. (ํด์๋งต์ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์)
- ํธ๋ผ์ด๋ฅผ ํ์ฉํด ํ์ํ ๊ฒฝ์ฐ ๋งต๋ณด๋ค ์๊ฐ์ ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค. (ํธ๋ฆฌ๋งต์ ๊ฒฝ์ฐ ์ด์ง ๊ฒ์ ํธ๋ฆฌ ํํ์ด๋ฏ๋ก ํ์ ์๊ฐ ๋ณต์ก๋๊ฐ
O(logN)
์) - ํธ๋ผ์ด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.