Duy Nguyen Hoang A fully enthusiastic boy

Trie – Cây Tiền Tố (Cây Từ Điển) là gì?

6 min read

trie

Khi nói về tìm kiếm và tìm kiếm nhanh chóng, Trie – một cấu trúc dữ liệu cực kỳ mạnh mẽ, thường được sử dụng. Có lẽ bạn đã nghe đến Trie mà không biết đó là gì. Trong bài viết này, chúng ta sẽ khám phá Trie, cấu trúc dữ liệu “Cây Tiền Tố,” cùng với các ứng dụng quan trọng của nó trong tìm kiếm và xử lý ngôn ngữ tự nhiên.

1. Trie là gì?

Trie là một cấu trúc dữ liệu cây mà thường được sử dụng để lưu trữ và tìm kiếm các từ hoặc chuỗi. Tên gọi “Trie” bắt nguồn từ từ “retrieval,” bởi vì nó được thiết kế đặc biệt để thực hiện việc truy xuất (retrieval) hiệu quả. Trie cũng được gọi là “Cây Tiền Tố” bởi vì nó lưu trữ tiền tố của chuỗi cùng với dữ liệu thực tế.

2. Cấu Trúc Của Trie

Trie bao gồm các nút (nodes) và các liên kết giữa chúng. Mỗi nút đại diện cho một ký tự trong chuỗi hoặc từ. Tại mỗi nút, có một mảng các con trỏ (thường là 26 con trỏ trong trường hợp tiếng Anh để đại diện cho 26 chữ cái) dẫn đến các nút con tương ứng với các ký tự tiếp theo. Điều này tạo ra một cấu trúc cây có thể biểu diễn toàn bộ từ điển.

3. Ứng Dụng Của Trie

Trie có nhiều ứng dụng hữu ích trong lĩnh vực xử lý ngôn ngữ tự nhiên (NLP) và tìm kiếm dữ liệu:

  • Tìm Kiếm Từ Điển: Trie thường được sử dụng để tìm kiếm từ điển với hiệu suất cao. Bởi vì nó lưu trữ tiền tố của từ, việc tìm kiếm các từ có cùng tiền tố trở nên nhanh chóng.
  • Gợi Ý Tìm Kiếm: Trie có thể được sử dụng để cung cấp gợi ý tìm kiếm khi người dùng bắt đầu nhập từ khóa.
  • Kiểm Tra Tính Hợp Lệ Của Từ: Trong NLP, Trie có thể sử dụng để kiểm tra tính hợp lệ của từ trong văn bản.
  • Tìm Kiếm Từ Khóa Trong Từ Điển: Trie cũng có thể được sử dụng để tìm kiếm từ khóa trong tài liệu hoặc cơ sở dữ liệu.

4. Ví dụ về việc triển khai cây Trie cho 6 từ

Hãy xem ví dụ về việc triển khai cây Trie cho các từ: “NCC”, “NCS”, “NOW”, “TREE”, “TRIE” và “HOW”

Cây Trie cho các từ trên bắt đầu từ nút gốc (Root) và theo từng ký tự để đến các nút con tương ứng. Điều này tạo ra một cấu trúc dữ liệu cây có khả năng tìm kiếm hiệu quả các từ và chuỗi.

5. Triển khai Cấu Trúc Trie Trong C++

Dưới đây là một triển khai đơn giản của cấu trúc Trie trong C++:

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

class TrieNode {
public:
    bool isEndOfWord;
    unordered_map<char, TrieNode*> children;

    TrieNode() {
        isEndOfWord = false;
    }
};

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

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

    bool search(string word) {
        TrieNode* current = root;
        for (char c : word) {
            if (current->children.find(c) == current->children.end()) {
                return false;
            }
            current = current->children[c];
        }


        return current->isEndOfWord;
    }

    bool startsWith(string prefix) {
        TrieNode* current = root;
        for (char c : prefix) {
            if (current->children.find(c) == current->children.end()) {
                return false;
            }
            current = current->children[c];
        }
        return true;
    }

private:
    TrieNode* root;
};

int main() {
    Trie trie;
    trie.insert("NCC");
    trie.insert("NCCSoft");
    trie.insert("Software");
    trie.insert("sorting");
    trie.insert("Nowadays");
    trie.insert("admit");

    cout << "Search for 'software': " << (trie.search("software") ? "Found" : "Not found") << endl;
    cout << "Starts with 'NCC': " << (trie.startsWith("NCC") ? "Found" : "Not found") << endl;
    cout << "Search for 'apple': " << (trie.search("apple") ? "Found" : "Not found") << endl;

    return 0;
}

6. Các Thao Tác Thêm, Duyệt, Tìm, Xóa trên Trie

Thêm một từ vào Trie

Để thêm một từ vào Trie, bạn cần làm theo các bước sau:

  1. Bắt đầu từ nút gốc của Trie.
  2. Duyệt qua các ký tự trong từ cần thêm.
  3. Với mỗi ký tự, kiểm tra xem nút con có tồn tại không. Nếu không tồn tại, tạo một nút con mới với ký tự đó.
  4. Di chuyển đến nút con tương ứng với ký tự đó và lặp lại bước 3 cho các ký tự tiếp theo.
  5. Khi bạn đã duyệt qua toàn bộ từ, đánh dấu nút cuối cùng là nút kết thúc từ.

Xóa một từ khỏi Trie

Để xóa một từ khỏi Trie, bạn cần làm theo các bước sau:

  1. Bắt đầu từ nút gốc của Trie.
  2. Duyệt qua các ký tự trong từ cần xóa.
  3. Với mỗi ký tự, kiểm tra xem nút con có tồn tại không. Nếu không tồn tại, từ cần xóa không tồn tại trong Trie.
  4. Di chuyển đến nút con tương ứng với ký tự đó và lặp lại bước 3 cho các ký tự tiếp theo.
  5. Khi bạn đã duyệt qua toàn bộ từ, đánh dấu nút cuối cùng là không phải nút kết thúc từ (nếu từ đó không phải là tiền tố của một từ khác).

Tìm kiếm một từ trong Trie

Để tìm kiếm một từ trong Trie, bạn cần làm theo các bước sau:

  1. Bắt đầu từ nút gốc của Trie.
  2. Duyệt qua các ký tự trong từ cần tìm kiếm.
  3. Với mỗi ký tự, kiểm tra xem nút con có tồn tại không. Nếu không tồn tại, từ đó không tồn tại trong Trie.
  4. Di chuyển đến nút con tương ứng với ký tự đó và lặp lại bước 3 cho các ký tự tiếp theo.
  5. Khi bạn đã duyệt qua toàn bộ từ, kiểm tra xem nút cuối cùng có đánh dấu là nút kết thúc từ không. Nếu có, từ đó tồn tại trong Trie.

Duyệt Trie

Duyệt Trie có thể được thực hiện bằng cách sử dụng thuật toán duyệt theo chiều sâu (DFS) hoặc duyệt theo chiều rộng (BFS). Dưới đây là ví dụ về duyệt DFS trong Markdown:

- Bắt đầu từ nút gốc.
- Hiển thị giá trị của nút hiện tại (ký tự hoặc từ kết thúc).
- Đối với mỗi nút con, lặp lại quy trình từ bước 2.

Nếu bạn muốn duyệt Trie theo chiều rộng, bạn sẽ sử dụng một hàng đợi (queue) để lưu trữ các nút con và thực hiện việc duyệt tương tự như trên nhưng với việc sử dụng hàng đợi thay vì đệ quy.

Kết Luận

Trie, hoặc Cây Tiền Tố, là một cấu trúc dữ liệu mạnh mẽ cho việc lưu trữ và tìm kiếm các từ và chuỗi. Nó có nhiều ứng dụng quan trọng trong lĩnh vực xử lý ngôn ngữ tự nhiên và tìm kiếm. Hiểu rõ về Trie có thể giúp bạn xây dựng các ứng dụng NLP hiệu quả và tối ưu hóa quá trình tìm kiếm dữ liệu.

Hy vọng rằng bạn đã học thêm về Trie và cách nó hoạt động trong bài viết này. Đừng ngần ngại thử ứng dụng nó trong các dự án của riêng bạn để cải thiện hiệu suất và khả năng tìm kiếm.

Avatar photo
Duy Nguyen Hoang A fully enthusiastic boy

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *