利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。经常被搜索引擎系统应用于文本词频统计。从根节点出发,途径的结点直到叶子结点,都可以构成单词。当然,有的可能在途中就可以构成单词,所以我们可以扩展,增加额外的信息,记录当前位置是否能够构成单词。
为什么说它可以减少无谓字符串的比较,通过下面的代码我们可以看到,对于每个字符,是采取随机存取的方式来判断它是否有子结点的。如果有,我们顺着这条路径下去,每次比较的都是两个单词的前缀。如果相同则继续下去,如果不同则“另辟蹊径”。可以发现我们每次的操作都是“有意义”的。那什么是无意义的呢?举例说明,如果我们有两个单词"ask", "aswl"中寻找"ash",那么需要分别对ask和aswl比较,那么对于‘a’和‘s’都是比较了两次的。而在前缀树中,我们只需要比较一次。所以提高了效率。
class TrieNode{
TrieNode *child[26];
public:
int count;
TrieNode(){
for(int i = 0; i < 26; i++) child[i] = NULL;
count = 0;
}
TrieNode* get(char ch){
if(child[ch - 'a'] == NULL){
child[ch - 'a'] = new TrieNode();
count++;
}
return child[ch - 'a'];
}
};
//如果count == 0,说明是叶结点
本文介绍了一种用于减少查询时间和无谓字符串比较的数据结构——前缀树。通过存储公共前缀,前缀树能有效提高搜索引擎系统的文本词频统计效率。文中详细解释了前缀树的工作原理,并通过实例对比了其与传统字符串比较方式的效率提升。
366

被折叠的 条评论
为什么被折叠?



