实现Trie数据结构的简单方法是使用std::map<char,*NodeTrie>
。如果我使用它会发生什么错误。我需要序列化和反序列化 Trie。所以节点中的每个映射都是AVL-树。也许我会有开销?但是在地图中我可以更快地搜索,如果我使用列表。
template < typename T >
struct NodeTrie{
std::map<char,*NodeTrie>`
bool isWord;
T & val;
};
实现Trie数据结构的简单方法是使用std::map<char,*NodeTrie>
。如果我使用它会发生什么错误。我需要序列化和反序列化 Trie。所以节点中的每个映射都是AVL-树。也许我会有开销?但是在地图中我可以更快地搜索,如果我使用列表。
template < typename T >
struct NodeTrie{
std::map<char,*NodeTrie>`
bool isWord;
T & val;
};
我喜欢你的想法。Tries 是重要的数据结构,我对 map<>s 作为高效容器有过愉快的体验。
只是一些评论:如果您的编译器支持它,您可以避免为每个节点分配单独的内存而浪费内存。
template< typename T >
struct NodeTrie {
NodeTrie(const T& val = T(), bool isWord = bool() ) : val(val), isWord(isWord) {}
std::map<char, NodeTrie> span;
T val;
bool isWord;
};
要以这种方式使用:
int main() {
typedef NodeTrie<int> iTree;
iTree t(0);
t.span['a'] = iTree(3);
...
}
此外,我将val
成员更改为可复制的可构造对象:在此处使用引用对我来说似乎是错误的设计......
仅供参考,GNU libc++ 在其基于策略的数据结构库中已经有一个 trie 模板。你可以像这样使用它:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>
using namespace std;
using namespace pb_ds;
trie <string, int> myTrie;
有关使用此类的一些示例,您可以参考this。