Trie๋ ?
- ์ ์ฅ๋ ๋ฌธ์์ด์ ํจ๊ณผ์ ์ผ๋ก ํ์ํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ
- ํธ๋ฆฌ ๊ตฌ์กฐ
- ์๊ฐ ๋ณต์ก๋ O(N) : N์ ๋ฌธ์์ด์ ๊ธธ์ด
- prefix tree, radix tree, retrieval tree ๋ฑ์ผ๋ก ๋ถ๋ฆ
- ๋จ์ : ๊ฑฐ๋ํ ๊ณต๊ฐ ๋ณต์ก๋
trie๋ ๋ฌธ์์ด ํ์์ ๊ต์ฅํ ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ์ด๋ค
๋ฌธ์์ด์ด ์ฃผ์ด์ง๊ฒ๋๋ฉด ๋ฌธ์๋ฅผ ์ ์ฅํ๋ ๋ ธ๋๋ฅผ ํ๋์ฉ ์์ฑํด๊ฐ๋ฉด์ ํธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค
์๋์ผ๋ก ์ ๋ ฌ๋ ํจ๊ณผ๋ฅผ ๋ณผ์ ์๋ค๋ ์ฅ์ ๋ ์๋ค
์์
root ๋ ธ๋๋ ๊ฐ์ฅ ์์ ๋ ธ๋๋ฅผ ์๋ฏธํ๋ค
"ALCUK" "EZ" "EZYUN" "EZYOON" 4๊ธ์๋ฅผ ๋ฃ์ Trie ํธ๋ฆฌ ๋ชจ์ |
๊ตฌํ
- ๊ฐ๋จํ ๊ธฐ๋ณธ ์ฝ๋
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int ptr_num = 10;
struct Trie {
bool finish;
//๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋ฐฐ์ด
Trie* child[ptr_num];
//์์ฑ์ : ํฌ์ธํฐ ๋ฐฐ์ด ๋ฐ ๋ณ์ ์ด๊ธฐํ
Trie() {
fill(child, child + ptr_num, nullptr);
finish = false;
}
//์๋ฉธ์ for ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
~Trie() {
for (int i = 0; i < ptr_num; i++) if (child[i]) delete child[i];
}
//๋ฌธ์ ์ฝ์
void insert(char* key) {
if (*key == NULL) {
finish = true; //๋ฌธ์์ด์ด ๋๋ฌ์ ๋ ๋์ ํ์ํ๊ณ ๋๋ด๊ธฐ
return;
}
else {
int cur = *key - 'A';
if (!child[cur]) child[cur] = new Trie; //์์๋
ธ๋๊ฐ ์๋ค๋ฉด ๋ง๋ค๊ธฐ
child[cur]->insert(key + 1); //์์๋
ธ๋๋ก ๋ณด๋ด ์ด์ด์ insert
}
}
//๋ฌธ์ ํ์
bool find(char* key) {
if (*key == NULL) {
if (finish = true) return true;
return false;
}
else {
int cur = *key - 'A';
if (child[cur] == NULL) return false;
return child[cur]->find(key + 1); //์์๋
ธ๋๋ก ๋ณด๋ด ์ด์ด์ find
}
}
};
๋ฐ์ํ
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค/python] ๋ถ๋ ์ฌ์ฉ์ (0) | 2022.03.25 |
---|---|
c++ vector / python list ํจ์ ์ ๋ฆฌ (0) | 2022.03.25 |
[Algorithm] KMP ์๊ณ ๋ฆฌ์ฆ (0) | 2021.01.23 |