Trie树(字典树)的C++实现

本文介绍了Trie树(字典树)的概念、特点及应用,如词频统计和前缀匹配。通过C++代码展示了如何实现Trie树,并提供了一个测试案例,用于构建单词树并检索以特定前缀开头的单词。
摘要由CSDN通过智能技术生成

问题描述:

Trie树

又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

举个例子:os,oh,old,char,chat这些关键词构成的trie树:

                               root

                             /         \

                          c            o

                         /               /  \

                       h              s     h

                     /  

                   a    

                 /  \

               r      t    

trie树特点:

①根节点不包含字符,其他节点均包含一个字符

②每个节点的最大分支数为字符可能取值的个数

③每个节点对应的单词为从根节点到该节点的路径上的字符的排列。

④两个单词的公共前缀为根节点到这两个点的路径的公共部分。


应用:

①词频统计:trie树中的公共前缀只由一条路径表示,因此相对于hash方法,节约了内存。

②前缀匹配:检索所有以某前缀开头的字符串。朴素做法的时间复杂度为O(n*N),n为前缀长度,N为单词个数,而使用trie树可以做到O(h)h为检索的单词的长度。

③串排序:N个字符串按字典序排序,只需trie树进行先序遍历

④串的快速检索:trie树的节点结构中可加入记录其他信息的变量,如某词在文章中第一次出现的位置编号等,问题例:给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。在这道题中,我们可以用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

算法:

树种单词的存储策略有两种:

①每个节点存一个字符

②每个节点存从根节点到该节点的路径表示的字符串


后一种方式需要的空间可能较多,但是检索的时候不需要一个辅助栈来记录路径,效率较高,本着空间换时间的原则,本文采用第二种存储方式。

代码实现:

测试:对单词集word.txt构建trie树,并给每个单词置一个ID号(可以认为是单词在字符集中第一次出现的位置),并检索其中以‘fu’开头的单词。

//TrieTreeNode.h
#pragma once
#include<iostream>
using namespace std;


template<class T>
class TrieTreeNode
{
public:
<span style="white-space:pre">	</span>TrieTreeNode(int MaxBranch)//用于构造根节点
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>MaxBranchNum = MaxBranch;
<span style="white-space:pre">		</span>ChildNodes = new TrieTreeNode<T>*[MaxBranchNum];
<span style="white-space:pre&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值