Trie树/字典树的简介及实现

简介: 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie树|字典树的简介及实现

1综述


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


它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。


Trie树结构的优点在于:


1) 不限制子节点的数量;


2) 自定义的输入序列化,突破了具体语言、应用的限制,成为一个通用的框架;


3) 可以进行最大Tokens序列长度的限制;


4) 根据已定阈值输出重复的字符串;


5) 提供单个字符串频度查找功能;


6) 速度快,在两分钟内完成1998年1月份人民日报(19056行)的重复字符串抽取工作。


优点来源于Linux公社网站(www.linuxidc.com)http://www.linuxidc.com/Linux/2012-04/57911.htm


2性质


它有3个基本性质:


1)     根节点不包含字符,除根节点外每一个节点都只包含一个字符。


2)     从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。


3)     每个节点的所有子节点包含的字符都不相同。


3基本操作


其基本操作有:查找、插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.


4实现方法


搜索字典项目的方法为:


 (1) 从根结点开始一次搜索;


 (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;


 (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。


 (4) 迭代过程……


(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。


其他操作类似处理


5. Trie原理——Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。



6.代码实现


const int branchNum = 26; //声明常量

int i;

struct Trie_node

{

      boolisStr;                //记录此处是否构成一个串。

      Trie_node*next[branchNum];//指向各个子树的指针,下标0-25代表26字符

      Trie_node():isStr(false)

      {

             memset(next,NULL,sizeof(next));

      }

};

class Trie

{

public:

    Trie();

    voidinsert(const char* word);

    boolsearch(char* word);

    voiddeleteTrie(Trie_node *root);

      // voidprintTrie(Trie_node *root);   //new add

private:

   Trie_node* root;

};

Trie::Trie()

{

    root =new Trie_node();

}

void Trie::insert(const char* word)

{

   Trie_node*location = root;

  while(*word)

    {

      if(location->next[*word-'a'] == NULL)//不存在则建立

        {

          Trie_node *tmp = new Trie_node();

          location->next[*word-'a'] = tmp;

       }  

      location = location->next[*word-'a']; //每插入一步,相当于有一个新串经过,指针要向下移动

      word++;

   }

  location->isStr = true; //到达尾部,标记一个串

}

bool Trie::search(char *word)

{

      Trie_node*location = root;

      while(*word&& location)

      {

             location= location->next[*word-'a'];

             word++;

      }

      return(location!=NULL && location->isStr);

}

void Trie::deleteTrie(Trie_node *root)

{

      for(i =0; i < branchNum; i++)

      {

             if(root->next[i]!= NULL)

             {

                    deleteTrie(root->next[i]);

             }

      }

      deleteroot;

}

void main() //简单测试

{

      Trie t;

      t.insert("a");        

      t.insert("abandon");

      char * c= "abandoned";

      t.insert(c);

      t.insert("abashed");

      if(t.search("abashed"))

      {

         printf("true\n");  //已经插入了

      }

}


相关文章
|
12月前
|
开发工具 git
LLM-03 大模型 15分钟 FineTuning 微调 GPT2 模型 finetuning GPT微调实战 仅需6GB显存 单卡微调 数据 10MB数据集微调
LLM-03 大模型 15分钟 FineTuning 微调 GPT2 模型 finetuning GPT微调实战 仅需6GB显存 单卡微调 数据 10MB数据集微调
289 0
|
API 开发工具 Android开发
简述大疆无人机对接
【2月更文挑战第7天】本文介绍了对接大疆无人机的主要目的,包括实时画面获取、飞行数据监测、操控飞行、媒体管理和业务功能开发等,并列举了多种开发接口如MobileSDK、UXSDK、云开发API等。重点讨论了MobileSDK在Android平台的应用,包括SDK集成步骤、直播推流和获取飞机实时数据的细节。另外,UXSDK用于加速应用开发,提供预设UI组件。上云API则简化了无人机与第三方云平台的集成,支持MQTT、HTTPS和WebSocket协议,适用于行业级无人机。对接流程涉及Pilot2和Dock的配置,以及数据传输和业务功能处理。文章还提及了如何对接多个飞机的方法。
9641 0
简述大疆无人机对接
|
缓存 Java Maven
Java 使用LRUmap设计一个简单的缓存场景
Java 使用LRUmap设计一个简单的缓存场景
635 0
Java 使用LRUmap设计一个简单的缓存场景
|
存储 缓存 安全
从软件和硬件角度去看内存
从软件和硬件角度去看内存
199 0
|
缓存 Java 编译器
Java 中的 JIT 和 AOT
我们都知道,Java 是一种半编译型,半解释型的语言,其编译部分和 C++ 语言比较类似,解释部分和 Python 语言比较类似,而 Java 则是综合了两种方式的语言。
591 1
|
XML Java 数据格式
Spring的LoadTimeWeaver(代码织入)
在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。
1738 0
|
缓存 监控 负载均衡
【Java虚拟机】JVM调优和分析案例综合实战
【Java虚拟机】JVM调优和分析案例综合实战
【Java虚拟机】JVM调优和分析案例综合实战
|
存储 机器学习/深度学习 缓存
针对存储排序文件过程中合并和压缩的算法LSM-Tree
LSM-Tree全称为Log-Structured Merge-Tree,日志结构合并树,它的架构分为内存部分和有序的磁盘部分,内存部分实现高速写,有序的磁盘部分实现高效查。
1284 0
针对存储排序文件过程中合并和压缩的算法LSM-Tree
|
分布式计算 分布式数据库 Hbase
hbase数据同步工具—HashTable/SyncTable
本文介绍hbase数据同步工具—HashTable/SyncTable,实现集群内部或跨集群之间的数据同步操作
|
Arthas 运维 监控
线上故障突突突?如何紧急诊断、排查与恢复
稳定性大于一切,因此我们需要有更有效的方式避免线上故障。在发生故障不可避免的假设下,我们需要能够快速修复,减少线上影响。基于以上这些想法,我们提出了1-5-10的快恢目标,所谓 1-5-10 的目标就是是要我们对于线上问题能够做到1分钟发现,5分钟定位,10分钟修复。
线上故障突突突?如何紧急诊断、排查与恢复