[c++] 트라이를 이용한 검색

트라이(Trie)는 문자열을 저장하고 검색하는 데 사용되는 트리 자료 구조입니다. 이 자료 구조는 일반적으로 문자열 검색 및 자동 완성 기능을 구현하는 데 유용합니다. C++에서는 트라이를 활용하여 효율적으로 문자열을 검색할 수 있습니다.

트라이(Trie)란?

트라이(Trie)는 각 노드가 문자를 나타내고, 각 경로가 글자열을 나타내는 트리 자료 구조입니다. 이 자료 구조를 사용하면 문자열을 저장하고 검색하는 데 O(m)의 시간복잡도를 가질 수 있습니다. 여기서 m은 문자열의 길이입니다. 이는 일반적인 해시 테이블이나 이진 검색 트리에 비해 훨씬 빠른 검색 시간을 제공합니다.

C++에서 트라이 사용하기

다음은 C++에서 트라이를 사용하여 문자열을 검색하는 간단한 예제입니다.

#include <iostream>
#include <unordered_map>
using namespace std;

struct TrieNode {
    unordered_map<char, TrieNode*> children;
    bool isEndOfWord;
};

class Trie {
public:
    Trie() {
        root = new TrieNode();
    }

    void insert(string word) {
        TrieNode* curr = root;
        for (char c : word) {
            if (curr->children.find(c) == curr->children.end()) {
                curr->children[c] = new TrieNode();
            }
            curr = curr->children[c];
        }
        curr->isEndOfWord = true;
    }

    bool search(string word) {
        TrieNode* node = searchPrefix(word);
        return node != nullptr && node->isEndOfWord;
    }

private:
    TrieNode* root;

    TrieNode* searchPrefix(string word) {
        TrieNode* curr = root;
        for (char c : word) {
            if (curr->children.find(c) == curr->children.end()) {
                return nullptr;
            }
            curr = curr->children[c];
        }
        return curr;
    }
};

int main() {
    Trie trie;
    trie.insert("apple");
    cout << trie.search("apple") << endl;   // Output: 1 (true)
    cout << trie.search("app") << endl;     // Output: 0 (false)
    return 0;
}

이 예제에서는 C++의 unordered_map을 사용하여 각 노드의 자식 노드를 저장합니다. 이를 통해 문자열을 효율적으로 저장하고 검색할 수 있습니다.

마치며

C++에서 트라이를 사용하면 문자열을 효율적으로 저장하고 검색할 수 있습니다. 이를 통해 문자열 기반의 다양한 응용프로그램을 구현할 수 있습니다.

참고 문헌: