我们在下面的文章中介绍并讨论了一个实现。
特里(插入和搜索)– 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
这里每个节点使用的空间与子代数成正比,这比与字母大小成正比好得多,尤其是在字母较大的情况下。