📜  使用哈希映射进行Trie内存优化

📅  最后修改于: 2021-04-17 10:08:26             🧑  作者: Mango

我们在下面的文章中介绍并讨论了一个实现。

特里(插入和搜索)– GeeksforGeeks

上一篇文章中使用的实现在每个节点上使用一个字母大小的数组。可以提高内存效率。一种实现Trie的方法是链接的节点集,其中每个节点都包含一个子指针数组,每个子指针数组用于字母表中的每个符号。时间上效率不高,因为我们无法快速找到特定的孩子。
一种有效的方式是一种实现,其中我们使用哈希映射存储节点的子代。现在,我们仅为使用中的字母分配内存,而不会浪费存储空指针的空间。

// A memory optimized CPP implementation of trie
// using unordered_map
#include 
#include 
using namespace std;
  
struct Trie {
  
    // isEndOfWord is true if the node
    // represents end of a word
    bool isEndOfWord;
  
    /* nodes store a map to child node */
    unordered_map map;
};
  
/*function to make a new trie*/
Trie* getNewTrieNode()
{
    Trie* node = new Trie;
    node->isEndOfWord = false;
    return node;
}
  
/*function to insert in trie*/
void insert(Trie*& root, const string& str)
{
    if (root == nullptr)
        root = getNewTrieNode();
  
    Trie* temp = root;
    for (int i = 0; i < str.length(); i++) {
        char x = str[i];
  
        /* make a new node if there is no path */
        if (temp->map.find(x) == temp->map.end())
            temp->map[x] = getNewTrieNode();
  
        temp = temp->map[x];
    }
  
    temp->isEndOfWord = true;
}
  
/*function to search in trie*/
bool search(Trie* root, const string& str)
{
    /*return false if Trie is empty*/
    if (root == nullptr)
        return false;
  
    Trie* temp = root;
    for (int i = 0; i < str.length(); i++) {
  
        /* go to next node*/
        temp = temp->map[str[i]];
  
        if (temp == nullptr)
            return false;
    }
  
    return temp->isEndOfWord;
}
  
/*Driver function*/
int main()
{
    Trie* root = nullptr;
  
    insert(root, "geeks");
    cout << search(root, "geeks") << " ";
  
    insert(root, "for");
    cout << search(root, "for") << " ";
  
    cout << search(root, "geekk") << " ";
  
    insert(root, "gee");
    cout << search(root, "gee") << " ";
  
    insert(root, "science");
    cout << search(root, "science") << endl;
  
    return 0;
}

输出:

1 1 0 1 1

这里每个节点使用的空间与子代数成正比,这比与字母大小成正比好得多,尤其是在字母较大的情况下。