1. ํธ๋ผ์ด(Trie)๋?
์ํ๋ ์์๋ฅผ ์ฐพ๊ธฐ์ํด ์์ฃผ ์ฌ์ฉ๋๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ ๋ฑ์์๋ ํ๊ฒ ์์๋ฅผ ์ฐพ๋๋ฐ์ O(logN)์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
ํ์ง๋ง ๋ฌธ์์ด์ ๊ฒฝ์ฐ ๋ ๋ฌธ์์ด์ ๋น๊ตํ๊ธฐ ์ํด์๋ ๋ฌธ์์ด์ ๊ธธ์ด๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์,
์ํ๋ ๋ฌธ์์ด์ ์ฐพ๊ธฐ ์ํด์๋ O(MlogN)์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋ฐ๋ผ์ ์ด ์์ ์ ์ฌ๋ฌ๋ฒ ์ํํ๋ค๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์์ด ๊ฒ์์์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ์๋ฃ๊ตฌ์กฐ๊ฐ ํธ๋ผ์ด(Trie)์ ๋๋ค.
- ํธ๋ผ์ด(Trie)๋ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํ ํธ๋ฆฌ ํํ์ ์๋ฃ๊ตฌ์กฐ
- ๊ตฌ๊ธ์ด๋ ๋ค์ด๋ฒ ๋ฑ์ ๊ฒ์์ด๋ฅผ ๊ฒ์ํ ๋ ๋ณผ ์ ์๋ ์๋์์ฑ ๊ธฐ๋ฅ, ์ฌ์ ๊ฒ์ ๋ฑ ๋ฌธ์์ด์ ํ์ํ๋๋ฐ ํนํ๋์ด์๋ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ํฉ๋๋ค.
- ๋๋์ค ํธ๋ฆฌ(Radix Tree)๋ ์ ๋์ฌ ํธ๋ฆฌ(Prefix Tree), ํ์ ํธ๋ฆฌ(Retrieval Tree)๋ผ๊ณ ๋ ํฉ๋๋ค
- ํธ๋ผ์ด(Trie)๋ Retrieval Tree์์ ๋์จ ๋จ์ด
์๋ฅผ ๋ค์ด 'Tistory'๋ผ๋ ๋จ์ด๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด ์ ์ผ ๋จผ์ 'T'๋ฅผ ์ฐพ๊ณ , ๋ค์์ 'i', 's', 't', ... ์ ์๋๋ก ์ฐพ์ผ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ ๊ฐ๋ ์ ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ๊ฐ ํธ๋ผ์ด(Trie)์ ๋๋ค.
2. ํธ๋ผ์ด(Trie)์ ์๋ ์๋ฆฌ
๋ค์ ๊ทธ๋ฆผ์ ๋ฌธ์์ด ์งํฉ {"apple", "app", "dad", "dream", "age"}๋ฅผ ํธ๋ผ์ด๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
*ํธ๋ผ์ด(Trie)๋ ์งํฉ์ ํฌํจ๋ ๋ฌธ์์ด์ ์ ๋์ฌ๋ค์ ๋์๋๋ ๋ ธ๋๋ค์ด ์๋ก ์ฐ๊ฒฐ๋ ํธ๋ฆฌ์ ๋๋ค.
[๊ณตํต ์ ๋์ด]
"apple"๊ณผ "app"์ "app"๋ผ๋ ๊ณตํต ์ ๋์ด๊ฐ ์์ผ๋ฏ๋ก ๊ฐ์ ์๋ธ ํธ๋ฆฌ์ ํ์๋ฉ๋๋ค.
์ฆ, "a"๋ผ๋ ๊ณตํต ์ ๋์ด๋ฅผ ๊ฐ์ง "apple", "app", "age"๋ Head์ ์์ ๋ ธ๋ 'a'์,
"d"๋ผ๋ ๊ณตํต ์ ๋์ด๋ฅผ ๊ฐ์ง "dad", "dream"์ Head์ ์์ ๋ ธ๋ 'd'์ ํ์๋ฉ๋๋ค.
[Leaf Node]
๋ฆฌํ ๋ ธ๋๋ ๊ฐ ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์๋ฏธํ๋ฏ๋ก, ๋จ์ด์ ๋ ๋ฌธ์๋ผ๋ ํ์(endOfWord)๋ฅผ ํด์ผํฉ๋๋ค.
๋ํ ๋ฆฌํ ๋ ธ๋์ ๊ฐ์๋ ๋จ์ด์ ๊ฐ์๋ฅผ ์๋ฏธํฉ๋๋ค.
[ํธ๋ผ์ด(Trie) ์์ฑ ๊ณผ์ ]
1. "apple"๋ฅผ ํธ๋ผ์ด์ ์ฝ์
- 'a': ์ฒซ๋ฒ์งธ ๋ฌธ์์ธ 'a'๋ ์ด๊ธฐ์ ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ ๋ด์ ์๋ฌด๊ฒ๋ ์์ผ๋ฏ๋ก Head์ ์์๋ ธ๋์ 'a'๋ฅผ ์ถ๊ฐ
- 'p': 'a' ๋ ธ๋์๋ ํ์ฌ ์์์ด ํ๋๋ ์์ผ๋ฏ๋ก 'a'์ ์์๋ ธ๋์ 'p'๋ฅผ ์ถ๊ฐ
- 'p', 'l', 'e'์ ๋ํด์๋ ์์๋ ธ๋๋ก ์ถ๊ฐ
- 'l': "apple" ๋จ์ด๊ฐ ๋๋จ์ ์๊ธฐ ์ํด 'l' ๋ ธ๋์ ๋ง์ง๋ง ๋ ธ๋(endOfWord)์์ ํ์
2. "app"๋ฅผ ํธ๋ผ์ด์ ์ฝ์
- 'a': ํ์ฌ Head์ ์์ ๋ ธ๋๋ก 'a'๊ฐ ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ 'a' ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๊ธฐ์กด์ ์๋ 'a'๋ ธ๋๋ก ์ด๋
- 'p': 'p'๋ 'a'์ ์์ ๋ ธ๋๋ก ์์ผ๋ฏ๋ก 'p'๋ก ์ด๋
- 'p': 'p'๋ 'a'์ ์์ ๋ ธ๋๋ก ์์ผ๋ฏ๋ก 'p'๋ก ์ด๋ํ๋ฉด์, 'p'๋ ธ๋์ ๋ง์ง๋ง ๋ ธ๋์์ ํ์
3. "dad", "dream", "age"๋ฅผ ํธ๋ผ์ด์ ์ฝ์
- "dad"์ "dream"์ ์ฒซ ๋ฌธ์์ธ 'd'๋ Head์ ์์ ๋ ธ๋๋ก ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํด์, ๊ฐ ๋จ์ด๋ณ๋ก ๋ฌธ์๋ฅผ ์์ฐจ์ ์ผ๋ก ์ถ๊ฐ
- "age"๋ Head์ ์์ ๋
ธ๋๋ก 'a'๊ฐ ์๊ธฐ ๋๋ฌธ์,
- 'a'๋ก ์ด๋ => 'a'์ ์์ ๋ ธ๋์ 'g'๊ฐ ์์ผ๋ฏ๋ก 'g'๋ฅผ ์ถ๊ฐ => 'e'๋ 'g'์ ์์ ๋ ธ๋๋ก ์ถ๊ฐํ ํ ๋ง์ง๋ง ๋ ธ๋ ํ์
3. ํธ๋ผ์ด(Trie) ๊ตฌํ(Java)
๊ทธ๋ผ ํธ๋ผ์ด๋ฅผ Java๋ก ๊ตฌํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๊ธฐ๋ณธ์ ์ผ๋ก๋ Map Interface๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํฉ๋๋ค.
Map์ Key๊ฐ์๋ ๋จ์ด๋ฅผ ์ด๋ฃจ๋ ๊ฐ๊ฐ์ ๋ฌธ์๋ค์ด ๋ค์ด๊ฐ๊ณ , Value์๋ ์์ ๋ ธ๋ ํด๋์ค๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด์ ์์ฐจ์ ์ผ๋ก ์๋ฐ๋ก ๊ตฌํ์ ํด๋ณด๊ฒ ์ต๋๋ค.
Node ํด๋์ค ์์ฑ
Node ํด๋์ค๋ ํด๋น ๋ ธ๋์ ์์ ๋ ธ๋์ ๋ณด์ ๋จ์ด์ ๋์ธ์ง๋ฅผ ํ๋จํ๋ ๋ณ์๋ก ๊ตฌ์ฑํฉ๋๋ค.
private class Node {
HashMap<Character, Node> childNode = new HashMap<>(); // ์์ ๋
ธ๋
boolean endOfWord; // ๋จ์ด์ ๋์ธ์ง์ ๋ํ ํ๋๊ทธ
}
ํธ๋ผ์ด(Trie) ์๋ฃ๊ตฌ์กฐ ํด๋์ค ์์ฑ
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฃจํธ ๋ ธ๋๋ฅผ ์ด๊ธฐํํด ์ค๋๋ค.
*๋ฃจํธ ๋ ธ๋๋ 1) ํญ์ ๋น์ด์๊ณ 2) ๋ฃจํธ๋ ธ๋์ ์์ ๋ ธ๋๋ ๊ฐ ๋จ์ด์ ์ฒซ ๊ธ์์ ๋๋ค.
public class Trie {
private Node rootNode;
Trie() {
// Trie ์์ฑ์ ๋ฃจํธ ๋
ธ๋๋ ๊ธฐ๋ณธ์ผ๋ก ์์ฑ
rootNode = new Node(); // ๋ฃจํธ ๋
ธ๋๋ ๋น ๋
ธ๋
}
}
๊ธฐ๋ณธ ๋ฉ์๋
1) ๋ ธ๋ ์ถ๊ฐ(insert)
์ ๋ ฅ ๋ฐ์ ๋จ์ด๋ฅผ ๋ฌธ์ ์๋๋ก ํธ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ์ ์์ ๋ ธ๋๋ก ์์ฑํด์ ๋ฃ์ต๋๋ค.
- ๋ฌธ์๊ฐ ์์ ๋ ธ๋์ ์กด์ฌํ๋ฉด ์๋ก ์์ฑํ์ง ์๊ณ ์์ ๋ ธ๋๋ก ์ด๋
- ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์์ธ ๋ ธ๋๋ผ๋ฉด endOfWord = true๋ก ์ค์
public void insert(String word) {
Node node = this.rootNode;
// ๋จ์ด์ ๋ฌธ์๋ฅผ ์ํํ๋ฉด์ ์์ ๋
ธ๋๋ฅผ ํ์ธ
// 1) ์์ ๋
ธ๋์ ์๋ ๋ฌธ์๋ผ๋ฉด ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ด
// 2) ์์ ๋
ธ๋์ ์๋ ๋ฌธ์๋ผ๋ฉด ์๋กญ๊ฒ ์์ฑ
for (int i=0; i<word.length(); i++) node = node.childNode.computeIfAbsent(word.charAt(i), key -> new Node());
node.endOfWord = true; // ๋จ์ด(word)์ ๋ฌธ์๋ฅผ ๋ชจ๋ ์ํํ๋ฉด ๋ง์ง๋ง ๋
ธ๋๋ ๋ฆฌํ ๋
ธ๋(=๋ง์ง๋ง ๋ฌธ์)์ด๊ธฐ๋๋ฌธ์ endOfWord๋ฅผ true๋ก ์ค์
}
2) ํฌํจ ์ฌ๋ถ ํ์ธ(contains)
ํน์ ๋จ์ด๊ฐ ํธ๋ผ์ด์ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ฃจํธ ๋ ธ๋๋ถํฐ ๋จ์ด์ ๋ฌธ์ ์๋๋ก ์ผ์นํ๋ ์์ ๋ ธ๋๊ฐ ๊ณ์ธต์ ์ด๋ฃจ๊ณ ์๋์ง ํ์ธ
- ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์์ endOfWord๊ฐ true
๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ๊ฐ ํธ๋ผ์ด์ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
public boolean contains(String word) {
Node node = this.rootNode;
char c;
for (int i=0; i<word.length(); i++) {
c = word.charAt(i);
if (!node.childNode.containsKey(c)) return false; // ํ์ฌ ํ์ํ๋ ๋ฌธ์๊ฐ ์์ ๋
ธ๋์ ์๋ค๋ฉด ์กด์ฌํ์ง ์๋ ๋จ์ด
node = node.childNode.get(c); // ๋ง์ง๋ง ๋ฌธ์๋ฅผ node์ ์ ์ฅ
}
return node.endOfWord; // ๋ง์ง๋ง ๋ฌธ์ ์ฌ๋ถ๋ฅผ ๋ฐํ
}
3) ๋ ธ๋ ์ญ์ (delete)
ํธ๋ผ์ด์ ์ถ๊ฐํ๋ ๋จ์ด๋ฅผ ์ญ์ ํฉ๋๋ค.
- ๋ถ๋ชจ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ ์๊ธฐ ๋๋ฌธ์ ์ญ์ ํ ๋จ์ด์ ๋ง์ง๋ง ๋ฌธ์๊น์ง ์ด๋ํด์ ๋ฌธ์๋ฅผ ์ญ์ ํด์์ผ ํฉ๋๋ค. => ์ฌ๊ท
- ๋ค์ ๋ฌธ์์ ์กด์ฌํ๋ ์์๋
ธ๋๊ฐ ์๊ณ , ์ญ์ ๋ฅผ ์์ํ๋ ๋ง์ง๋ง ๋
ธ๋(๋ฆฌํ ๋
ธ๋)์๋ endOfWord๊ฐ true๋ก ๋์ด์์ด์ผ ํฉ๋๋ค.
- ์ฆ, ์ญ์ ํ ๋จ์ด๊ฐ ํธ๋ผ์ด์ ํฌํจ๋์ด์์ด์ผ ํฉ๋๋ค.
- ๋จ์ด ์ญ์ ๋ฅผ ์ํด ๋ง์ง๋ง ๋ฌธ์ ๋
ธ๋์ธ ๋ฆฌํ ๋
ธ๋์ endOfWord๋ฅผ false๋ก ๋ณ๊ฒฝํฉ๋๋ค. ์ดํ ์์ฐจ์ ์ผ๋ก ๊ฑฐ๊พธ๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ๋
ธ๋๋ฅผ ์ญ์ ํฉ๋๋ค. ๋จ, ์๋ ๋ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ญ์ ํฉ๋๋ค.
- ํด๋น ๋
ธ๋์ ์์๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
- ์์๋ ธ๋๊ฐ ์๋ค๋ ๋ป์ ๋ค๋ฅธ ๋จ์ด์ ์ฌ์ฉ๋๋ ๋ฌธ์๋ผ๋ ๋ป์ด๋ฏ๋ก ์ญ์ ํ๋ฉด ์๋ฉ๋๋ค.
- endOfWord๊ฐ true์ธ ๊ฒฝ์ฐ
- ๋จ์ด์ ๋์ธ ๋ฌธ์์ธ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋จ์ด์ ์ฌ์ฉ๋๋ ๋ฌธ์๋ผ๋ ๋ป์ด๋ฏ๋ก ์ญ์ ํ๋ฉด ์๋ฉ๋๋ค.
- ํด๋น ๋
ธ๋์ ์์๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
public void delete(String word) {
delete(this.rootNode, word, 0);
}
// ์ฌ๊ท ํธ์ถ์ ์ํ ํจ์ ์ค๋ฒ๋ก๋ฉ
private void delete(Node node, String word, int idx) {
// ๋จ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ธ ๊ฒฝ์ฐ
if (idx == word.length()) {
if (!node.endOfWord) throw new Error(word + " not exist"); // ๋จ์ด๊ฐ ์กด์ฌํ์ง ์์
node.endOfWord = false; // ๋จ์ด์ ๋ ๋ฌธ์ ํ์๋ฅผ false๋ก ๋ณ๊ฒฝ: ํด๋น ๋ฌธ์ ๋
ธ๋๋ฅผ ์ญ์ ํ๊ธฐ ์ํจ
return; // ๋ฆฌํ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋๋ก return
}
char c = word.charAt(idx); // ํ์ฌ ํ์ธํด์ผํ๋ ๋ฌธ์
if (!node.childNode.containsKey(c)) throw new Error(word + " not exist"); // ์์ ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ(=๋จ์ด๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ)
Node child = node.childNode.get(c); // ์์ ๋
ธ๋ ๊ฐ์ ธ์ค๊ธฐ
// ์์ ๋
ธ๋๊ฐ ์๋ค๋ฉด ๋ฆฌํ ๋
ธ๋๊น์ง ๋ด๋ ค๊ฐ์ผ ํ๋ฏ๋ก ์ฌ๊ท ํธ์ถ
delete(child, word, idx+1);
// ํ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ๋ฆฌํ ๋
ธ๋์ด๊ณ (=์์ ๋
ธ๋๊ฐ ์์), ๋จ์ด์ ๋์ธ ๋ฌธ์๊ฐ ์๋๋ผ๋ฉด ์ญ์
if (child.childNode.isEmpty() && !child.endOfWord) node.childNode.remove(c, child);
}
๐งช ๊ตฌํ ํ ์คํธ
public static void main(String[] args) {
Trie trie = new Trie();
// insert
String[] arr = {"apple", "app", "dream", "dad", "age"};
for (String word: arr) {
trie.insert(word);
}
// delete
trie.delete("app");
trie.delete("dream");
// contains
System.out.println(trie.contains("apple")); // true
System.out.println(trie.contains("app")); // ์ญ์ ํ์ผ๋ฏ๋ก false
System.out.println(trie.contains("age")); // true
System.out.println(trie.contains("dream")); // ์ญ์ ํ์ผ๋ฏ๋ก false
System.out.println(trie.contains("dad")); // true
}
์์์ ์์๋ก ๋ค์๋ ๋ฌธ์์ด ๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ํธ๋ผ์ด๋ฅผ ์์ฑํ๊ณ ์ญ์ , ํฌํจ์ฌ๋ถ๋ฅผ ํ์ธํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๐ก ์ ์ฒด ์ฝ๋๋ ์๋ ๋งํฌ์์ ํ์ธํด์ฃผ์ธ์.
Algorithm/src/Trie.java at main · hywnj/Algorithm
Contribute to hywnj/Algorithm development by creating an account on GitHub.
github.com
4. ํธ๋ผ์ด(Trie) ์๊ฐ ๋ณต์ก๋
์ด ๋ฌธ์์ ๊ฐ์๋ฅผ N, ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ L์ด๋ผ๊ณ ํ ๋
- ์์ฑ ์๊ฐ ๋ณต์ก๋: O(N*L)
- ๋ชจ๋ ๋ฌธ์์ด N๊ฐ๋ฅผ ๋ฃ์ด์ผํ๊ณ , N๊ฐ์ ๋ํด ํธ๋ผ์ด์ ๋ฃ๋ ๊ฑด ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด ๊ธธ์ด์ธ L๋งํผ ๊ฑธ๋ฆฐ๋ค.
- ์ฝ์ ์ O(L)๋ง ์์
- ํ์ ์๊ฐ ๋ณต์ก๋: O(L)
- ํธ๋ฆฌ๋ฅผ ๊ฐ์ฅ ๊น๊ฒ ํ์ํ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด ๊ธธ์ด์ธ L๊น์ง ๋ค์ด๊ฐ๋ ๊ฒ์ด๋ฏ๋ก O(L)
5. ํธ๋ผ์ด(Trie) ์ฅ๋จ์
- ๋ฌธ์์ด์ ๋ํ ๊ฒ์์ ๋น ๋ฅด๊ฒ ํ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด์ ์งํฉ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ ๊ธธ์ด๋งํผ ๋ ธ๋๋ฅผ ๋ฐ๋ผ๊ฐ๊ฑฐ๋ ์ถ๊ฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ์ถ๊ฐ์ ํ์ ๋ชจ๋ O(M)๋ง์ ๊ฐ๋ฅํฉ๋๋ค.
- ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
- ๊ฐ ๋ ธ๋์์ ์์๋ค์ ๋ํ ํฌ์ธํฐ๋ค์ ๋ฐฐ์ด๋ก ๋ชจ๋ ์ ์ฅํ๊ณ ์๊ธฐ์ ์ ์ฅ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ ํฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
- ๋ฌธ์์ด์ด ๋ชจ๋ ์์๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์์ด๋, ์์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ 26๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ ์ ํด์ผํ๋๋ฐ
- ์ต์
์ ๊ฒฝ์ฐ์๋ ์งํฉ์ ํฌํจ๋๋ ๋ฌธ์์ด์ ๊ธธ์ด์ ์ด ํฉ๋งํผ์ ๋
ธ๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ O(ํฌ์ธํฐ ํฌ๊ธฐ*ํฌ์ธํฐ ๋ฐฐ์ด ๊ฐ์*์ด ๋
ธ๋ ๊ฐ์)๊ฐ ๋ฉ๋๋ค.
- ๋ง์ฝ 1,000์๋ฆฌ์ ๋ฌธ์์ด์ด 1,000๋ง๊ฐ๊ฐ ์๋ค๋ฉด ์ด๋, 100๋ง๊ฐ์ ๋ ธ๋๊ฐ ํ์ํ๊ณ ํฌ์ธํฐ์ ํฌ๊ธฐ๊ฐ 8Byte๋ผ ํ๋ฉด ์ฝ 200MB์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
ํธ๋ผ์ด(Trie) ๋จ์ ํด๊ฒฐ์ ์ํ ๋ฐฉ๋ฒ
'๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฐ' ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ณดํต map์ด๋ vector๋ฅผ ์ด์ฉํด์ ํ์ํ ๋ ธ๋๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด ํ์ดํธํ ๊ฒฝ์ฐ์๋ ์ต์ ํ๊ฐ ๊น๋ค๋กญ์ต๋๋ค.
๋ํ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ณด๊ณ ํธ๋ผ์ด๋ฅผ ์ด์ฉํ ์ ์๋ ๋ฌธ์ ์ธ์ง ํ์ ํ๋ ๊ฒ๋ ์ค์ํ๋ค๊ณ ํฉ๋๋ค.
6. ํธ๋ผ์ด(Trie) ์ฝ๋ฉํ ์คํธ ๋ฌธ์
์ฐธ๊ณ ํ ๋งํฌ
'๐ฌ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] ๋ชจ๋ ธํค ์คํ(Monotone stack) (0) | 2024.07.17 |
---|---|
[์๋ฃ๊ตฌ์กฐ] ํธ๋ผ์ด(Trie) - Java๋ก ๊ตฌํํ๋ 2๊ฐ์ง ๋ฐฉ์ (1) | 2024.07.16 |