๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์ž๋ฃŒ๊ตฌ์กฐ] Trie ํŠธ๋ผ์ด

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
		}
	}
};

 

 

 

 

๋ฐ˜์‘ํ˜•