Trie

✍ dations ◷ 2025-07-20 20:33:33 #数据结构

在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

Trie这个术语来自于retrieval。根据词源学,trie的发明者Edward Fredkin把它读作/ˈtriː/ "tree"。但是,其他作者把它读作/ˈtraɪ/ "try"。

在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。

键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示trie的原理。

trie中的键通常是字符串,但也可以是其它的结构。trie的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如,bitwise trie中的键是一串比特,可以用于表示整数或者内存地址。

trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

trie树实际上是一个确定有限状态自动机(DFA),通常用转移矩阵表示。行表示状态,列表示输入字符,(行,列)位置表示转移状态。这种方式的查询效率很高,但由于稀疏的现象严重,空间利用效率很低。也可以采用压缩的存储方式即链表来表示状态转移,但由于要线性查询,会造成效率低下。

于是人们提出了下面两种结构。

三数组Trie(Triple-Array Trie)结构包括三个数组:base,next和check.

二数组Trie(Double-Array Trie)包含base和check两个数组。base数组的每个元素表示一个Trie节点,即一个状态;check数组表示某个状态的前驱状态。

这是一个用于词频统计的程序范例,因使用了getline(3),所以需要glibc才能链接成功,没有glibc的话可以自行改写。

相关

  • 大陆漂移学说大陆漂移学说是地球大陆相对于彼此的运动,因此似乎在海床上“漂流”。最初由亚伯拉罕·奥特柳斯在1596年提出,后来德国科学家阿尔弗雷德·魏格纳在1912年加以阐述,中文中“大陆
  • 勃艮第-弗朗什-孔泰勃艮第-弗朗什-孔泰(法语:Bourgogne-Franche-Comté)为法国大区,根据2014年大区重划,由弗朗什-孔泰、勃艮第两个大区合并而成,2016年1月1日起生效。5个海外省及大区
  • 分类学 (消歧义)分类学是关于对事物进行分类的科学分支。中文中,“分类学”一词原则上可以指对任何事物进行分类的科学方法,但现时多指生物学方面的分类法,又可以细分为以下几个:
  • 八德区八德区(台湾话:.mw-parser-output .sans-serif{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif} Pat-t
  • 芬妮和亚历山大《芬妮和亚历山大》(Fanny och Alexander),是一部1982年瑞典、法国和西德合作拍摄的电影。导演和编剧都是英格玛·伯格曼。故事背景是1907年到1909年间的一个瑞典小镇。影片198
  • 邓宁邓宁(英文名:Denny ,1986年4月29日-),汉族,中国大陆歌手,就读于于西安外事学院,2006年参加江苏卫视《绝对唱响》获得全国总季军。2007年获得江苏卫视《名师高徒》全国总冠军,同年签约
  • 2007年世界房车锦标赛德国站2007年世界房车锦标赛德国站是2007年度世界房车锦标赛的第八站赛事,正式比赛在2007年8月26日于德国奥舍斯莱本赛道上举行。这是历来第三次在德国举行赛事。第一回合由西亚车
  • 魏金水魏金水(1906年5月26日-1992年8月11日),中国福建龙岩人,客家人,中华人民共和国官员。魏1928年参加当地农民协会,次年加入中国共产党,任红十九军团政委,后长期指挥龙岩地方武装。1934年
  • 芽是植物新生长的部位,包括种子发芽、茎顶芽、叶腋芽、不定芽等等。芽依所在位置分为顶芽、腋芽和不定芽。因为每片叶子都有一个腋芽,腋芽的分布如同叶序,可以分为互生、对生和
  • 陈爌陈爌,字公朗,河南孟津人。清初政治人物。陈爌为顺治三年丙戌科(1646年)二甲第二名进士,此科亦为清代首次开科。他随即被选为庶吉士,散馆授编修,顺治五年,任浙江乡试考试官。顺治九年