数据结构与算法 字典树

简介

字典树又称单词查找树,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;
}

猜你喜欢

转载自blog.csdn.net/qq_39821316/article/details/82979811