简介
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
(图片源自百度百科)
实现
/**
* 字典树
*
* @桀骜 2018/8/3
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define NODE_MAX 26 //每个结点next指针数
class TrieNode {
public:
TrieNode *next[NODE_MAX];
bool end; //该结点是否有单词终止
TrieNode() {
memset(next, NULL, sizeof(next));
end = false;
}
};
class TrieTree {
public:
TrieNode *root;
void init() {
root = new TrieNode();
}
void insert(char *str) {
if (str == NULL || strlen(str) == 0) return;
int len = strlen(str);
TrieNode *node = root;
for (int i = 0; i < len; i++) {
int pos = str[i] - 'a'; //默认小写字母
if (node->next[pos] == NULL) {
node->next[pos] = new TrieNode();
}
node = node->next[pos];
}
node->end = true;
}
bool find(char *str) {
int len = strlen(str);
TrieNode *node = root;
for (int i = 0; i < len; i++) {
int pos = str[i] - 'a'; //默认小写字母
if(node->next[pos] == NULL) {
return false;
}
node = node->next[pos];
}
if (node->end) {
return true;
} else {
return false;
}
}
};
//测试
int main() {
TrieTree t;
char words[10][20], article[100];
for (int i = 0; i < 5; ++i) {
cin >> words[i];
t.insert(words[i]);
}
cin >> article;
for (int i = 0; i < 5; ++i) {
cout << t.find(article)<<endl;
}
return 0;
}