01/10/2018, 15:24

"index=key[i] -'a'" trong phần insert từ khóa vào Trie của đoạn code dưới có ý nghĩa gì?

Cho e hỏi trong phần insert từ khóa vào trong cây của đoạn code dưới thì sao index=key[i] -‘a’.

// C++ implementation of search and insert
// operations on Trie
#include <bits/stdc++.h>
using namespace std;
 
const int ALPHABET_SIZE = 26;
 
// trie node
struct TrieNode
{
    struct TrieNode *children[ALPHABET_SIZE];
 
    // isEndOfWord is true if the node represents
    // end of a word
    bool isEndOfWord;
};
 
// Returns new trie node (initialized to NULLs)
struct TrieNode *getNode(void)
{
    struct TrieNode *pNode =  new TrieNode;
 
    pNode->isEndOfWord = false;
 
    for (int i = 0; i < ALPHABET_SIZE; i++)
        pNode->children[i] = NULL;
 
    return pNode;
}
 
// If not present, inserts key into trie
// If the key is prefix of trie node, just
// marks leaf node
void insert(struct TrieNode *root, string key)
{
    struct TrieNode *pCrawl = root;
 
    for (int i = 0; i < key.length(); i++)
    {
        int index = key[i] - 'a';
        if (!pCrawl->children[index])
            pCrawl->children[index] = getNode();
 
        pCrawl = pCrawl->children[index];
    }
 
    // mark last node as leaf
    pCrawl->isEndOfWord = true;
}
viết 17:32 ngày 01/10/2018

index=key[i] -'a' là để chuyển ký tự về số nguyên. Do children đánh số từ 0 tới 25, mà ký tự thì đi từ ‘a’ tới ‘z’, nên phải chuyển ‘a’ về 0, ‘b’ về 1, …, ‘z’ về 25. Có nhiều cách chuyển, cách dễ hiểu nhất là lấy ký tự đó trừ đi ‘a’, vì trong C++ ký tự là 1 số nguyên 8-bit, nên có thể lấy ký tự trừ ký tự. ‘a’ - ‘a’ ra 0, ‘b’ - ‘a’ ra 1, v.v…

Hoàng Vn viết 17:35 ngày 01/10/2018

bạn cho mk hỏi luôn là chỗ khai báo này ở đoạn đâu đấy nghĩ là gì đc ko?
struct TrieNode *children[ALPHABET_SIZE];

viết 17:26 ngày 01/10/2018

bạn học cây nhị phân rồi chắc biết 1 node của cây nhị phân có 2 children là left và right, còn ở đây cây này có tới tận 26 children, vì ký tự tiếng Anh có 26 ký tự. children[0] là aChild, children[1] là bChild, …, children[25] là zChild. Vì liệt kê ra khổ dâm quá nên người ta xài mảng cho khỏe. Nếu bạn thích bạn khai báo node cây nhị phân là Node* children[2] cũng được

khi khởi tạo 1 node của cây nhị phân bạn nhớ có dòng gán left = NULLright = NULL, ở đây cũng tương tự với dòng children[i] = NULL;

Hoàng Vn viết 17:35 ngày 01/10/2018

ok. tks bạn nhiều…

Bài liên quan
0