ํธ๋ผ์ด์ ๊ฐ๋
ํธ๋ผ์ด(Trie)๋ ๋ฌธ์์ด ๊ฒ์์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด ์ค๊ณ๋ ํธ๋ฆฌ ๊ธฐ๋ฐ ์๋ฃ๊ตฌ์กฐ๋ค. ํธ๋ผ์ด๋ผ๋ ์ด๋ฆ์ ๊ฒ์์ ์๋ฏธํ๋ "retrieval"์์ ์ ๋ํ๋ค. ํธ๋ผ์ด๋ ์ฃผ๋ก ๋ฌธ์์ด ํค๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํค๊ฐ ๊ณตํต ์ ๋์ฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ์ธก๋ฉด์์ ์ด์ ์ ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ ์ ๋์ฌ ํธ๋ฆฌ(Prefix Tree)๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
ํธ๋ผ์ด์ ๊ตฌ์กฐ
ํธ๋ผ์ด๋ ๋ฌธ์์ด ํค๋ฅผ ๋ ธ๋์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ ์ฅํ๋ค. ๊ฐ ๋ ธ๋๋ ๊ฐ๋ณ ๋ฌธ์๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ฃจํธ ๋ ธ๋์์๋ถํฐ ์์ํด์ ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์์ ๋ฐ๋ผ ํ์ ๋ ธ๋๋ก ์ด๋ํ๋ฉด์ ํค๋ฅผ ๊ตฌ์ฑํ๋ค.
- ๋ฃจํธ ๋ ธ๋๋ ๊ณต๋ฐฑ ๋ฌธ์ ๋๋ ๋น ์ํ๋ก ์์
- ์์ ๋ ธ๋๋ ์ํ๋ฒณ, ์ซ์, ํน์ ๋ฌธ์ ๋ฑ ํ์ฉ๋ ๋ฌธ์ ์ค ํ๋๋ฅผ ๋ํ๋
- ๋ฌธ์์ด์ ๋์ ์ข ๋จ ๋ ธ๋(End of Word Node)๋ก ํ์
์ ๊ทธ๋ฆผ์ ํธ๋ผ์ด์ ์ ์ฅ๋๋ ๊ตฌ์กฐ๋ก ๋ค์ ํํํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค. (์ฐธ๊ณ ๋ก ์๋์ ๊ฒฝ์ฐ, ์ข
๋จ ๋
ธ๋ ๋์ isEnd
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์์ด์ ๋์ ํ์ํ๋ค.)
ํธ๋ผ์ด์ ์๊ฐ๋ณต์ก๋
๋ฌธ์์ด์ด N๊ฐ ์๊ณ , ๋ฌธ์์ด์ ํ๊ท ๊ธธ์ด๊ฐ L์ผ ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ดํด๋ณด์.
ํธ๋ผ์ด ์์ฑ ์๊ฐ๋ณต์ก๋
๋ฌธ์์ด N๊ฐ๋ฅผ ํธ๋ผ์ด์ ์ฝ์ ํ ๋์ ์๊ฐ๋ณต์ก๋๋ O(N*L)์ด๋ค. ๊ฐ ๋ฌธ์์ด์ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ํธ๋ผ์ด์ ์ฝ์ ํ๋ฏ๋ก, ๋ฌธ์์ด ๊ธธ์ด์ ๋น๋กํ ์๊ฐ์ด ์์๋๋ค.
๋ฌธ์์ด ๊ฒ์ ์๊ฐ๋ณต์ก๋
ํธ๋ผ์ด์์ ํน์ ํ ๋ฌธ์์ด์ ๊ฒ์ํ๋ ์๊ฐ๋ณต์ก๋๋ O(L)์ด๋ค. ๋ฃจํธ ๋ ธ๋์์ ์์ํด ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ ๊ณผ์ ์์ ๊ฐ ๋ ธ๋์ ์์ ๋ ธ๋๋ก ์ด๋ํ๋ ์์ ์ด O(1) ์๊ฐ์ ์ด๋ฃจ์ด์ง๋ฏ๋ก, ์ ์ฒด ํ์ ์๊ฐ์ ๋ฌธ์์ด์ ๊ธธ์ด์๋ง ์์กดํ๋ค.
๊ณตํต ์ ๋์ฌ ๊ฒ์
๊ณตํต ์ ๋์ฌ๋ฅผ ํ์ํ๋ ์์ ๋ํ O(L) ์๊ฐ์ ์ํ๋๋ค. ์ ๋์ฌ์ ๊ธธ์ด์ ๋น๋กํ์ฌ ํ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ํ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํธ๋ผ์ด์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ๋ฌธ์์ด ๊ฒ์์ด O(L) ์๊ฐ์ ์ํ๋์ด ๋น ๋ฅธ ๊ฒ์์ด ๊ฐ๋ฅํ๋ค.
- ์ ๋์ฌ ๊ธฐ๋ฐ ๋ฌธ์์ด ๊ฒ์์ ์ต์ ํ ๋์ด ์๋ค.
๋จ์
- ๋ฌธ์ ์งํฉ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๊ฐ ๋ ธ๋๊ฐ ๋ง์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ค.
- ๋จ์ ๋ฐฐ์ด์ด๋ ํด์๋งต๋ณด๋ค ๊ตฌ์กฐ๊ฐ ๋ณต์กํด ๊ตฌํ ๋์ด๋๊ฐ ๋๋ค.
ํธ๋ผ์ด์ ์ฌ์ฉ ์ฌ๋ก
- ๋ฌธ์์ด ๊ฒ์ ๋ฐ ์๋์์ฑ
- ์ฌ์ ๊ตฌํ: ๋ฌธ์์ด์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ณ , prefix ๊ธฐ๋ฐ ๊ฒ์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ๋
- ์๋์์ฑ ์์คํ : ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋์ค์ ๊ฐ๋ฅํ ๋จ์ด๋ค์ ๋น ๋ฅด๊ฒ ์ฐพ์์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ
- ๋ฌธ์์ด ํจํด ๋งค์นญ, ๋ฌธ์์ด ํํฐ๋ง
- ๋ฌธ์์ด ํจํด ๋งค์นญ: ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์์ด ํจํด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ๋(ex. DNA ์ผ๊ธฐ ์์ด ํจํด ๋งค์นญ)
- ๋ฌธ์์ด ํํฐ๋ง: ํน์ ๋ฌธ์์ด์ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ฑฐ๋ ์ ์ธํ๋ ๊ฒฝ์ฐ
- ์ ๋์ด ๊ธฐ๋ฐ ๊ฒ์
- ๋จ์ด์ ์ ๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅด๊ฒ ์ผ์นํ๋ ๋ฌธ์์ด์ ์ฐพ์ ๋
- IP ์ฃผ์ ๋ผ์ฐํ : ๋คํธ์ํฌ ๋ผ์ฐํ ํ ์ด๋ธ์์ IP ์ฃผ์์ ์ ๋์ฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ์(ex. CIDR(Classless Inter-Domain Routing) ๊ธฐ๋ฐ ๋ผ์ฐํ )
- ๋ฐ์ดํฐ ์์ถ
- Lempel-Ziv-Welch(LZW) ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ด ์ค๋ณต๋ ๋ฌธ์์ด์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฅํ์ฌ ๋ฐ์ดํฐ ์์ถ์ ์ฌ์ฉ
ํธ๋ผ์ด ๊ตฌํ (Python)
class TrieNode:
def __init__(self):
self.children = {}
self.isEnd = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word): # ํธ๋ผ์ด์ ๋จ์ด๋ฅผ ์ฝ์
ํ๋ ๋ฉ์๋
node = self.root
for char in word:
if char not in node.chlidren:
node.children[char] = TrieNode()
node = node.children[char]
node.isEnd = True # ๋จ์ด์ ๋์ ํ์
def search(self, word): # ํธ๋ผ์ด์์ ํน์ ํ ๋จ์ด๋ฅผ ์ฐพ๋ ๋ฉ์๋
node = self.root
for char in word:
if char not in node.children:
return False
node = node[char]
return node.isEnd
def starts_with(self, prefix): # ํธ๋ผ์ด์์ ํน์ ์ ๋์ฌ๋ก ์์ํ๋ ๋จ์ด๊ฐ ์๋์ง ํ์ธํ๋ ๋ฉ์๋
node = self.root
for char in perfix:
if char not in node.children:
return False
node = node.children[char]
return True
# ์ฌ์ฉ ์์
trie = Trie()
trie.insert("apple")
trie.insert("app")
trie.insert("banana")
print(trie.search("apple")) # True
print(trie.search("ban")) # False
print(trie.starts_with("app")) # True
print(trie.starts_with("ban")) # True