前缀树,也叫字典树,是一种树形结构,是哈希树的变形。典型应用用于统计和排序大量的字符串,当然不仅限于字符串,常用于文本词频的统计。
它的优点是:利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。
Trie树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销,以达到提高效率的目的、
前缀树的3个基本性质:
1.结点上不含有字符,字符视为都在传递路径上。
2.从根结点到某一个结点,路径上经过的字符连接起来,为该节点对应的字符串。
3.相同的字符串有且只有一个路径。
TrieNode结点:
class TrieNode
{
public:
TrieNode()
{
pass=0;end=0;children.resize(26);
}
int pass;//表示以该字符为前缀的字符串数量
int end;//以当前字符结尾的字符串数量
vector children;//子节点
};
前缀树的构建
class Trie {
public:
TrieNode* root;
Trie() {
root=new TrieNode();
}
void insert(string word) {
TrieNode* node=root;//获得根节点
int index=0;//建立字符索引号
node->pass++;//当前结点pass值++;
for(int i=0;ichildren[index]==nullptr)//如果说该索引下无节点,那么就创建它
node->children[index]=new TrieNode();
node=node->children[index];//结点运动到子节点位置
(node->pass)++;//结点的pass值++
}
(node->end)++;//最终的结点的end值++;
}
//搜索字符串是否存在
bool search(string word) {
TrieNode* node=root;//获得根节点
int index=0;//建立字符索引号
for(int i=0;ichildren[index]==nullptr)//如果发现某个字符索引下无节点,
//那太好了,直接false
return false;
node=node->children[index];//跟下去
}
if(node->end!=0)//跳出循环一定是字符串循环完了,就看下当前结点的end值是否为0,
//为0,说明没有字符串以该字符结尾,返回false
return true;
else
return false;
}
//查找某字符串是否存在或者是否为前缀字符串
bool startsWith(string prefix) {
TrieNode* node=root;//获得根节点
int index=0;//建立字符索引号
for(int i=0;ichildren[index]==nullptr)
return false;
node=node->children[index];
}
return true;
}
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)