字典树 r囧r小猫 2022-04-10 01:47 248阅读 0赞 ## 1 定义 ## 键树又称数字查找树,它是一棵度大于2的树,树中的每个节点值含有组成关键字的符号。例如,若关键字是数值,则节点中只包含一个数位。若关键字是单词,则节点中只包含一个字母字符。这种树会给某种类型的关键字的表的查找带来方便。 ![在这里插入图片描述][20181219173409284] **通常键树有两种存储结构:双链树和Trie树** ## 2 双链树 ## **双链树是以孩子兄弟链表来表示的键树**,每个分支节点包含3个域:symbol域(用于存储关键字的一个字符),first域(存储指向子树根的指针),next域(存储指向右兄弟的指针)。同时叶子节点的infoptr域存储指向关键字记录的指针。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70] **双链树的查找代码如下:** Record * SearchDLTree(DLTree T, KeysType K){ //在非空双链树T中查找关键字等于K的记录 p = T->first;i=0; //初始化,从第一个带有字符的节点开始 while(p && i<K.num){ //依次遍历关键字的字符 while(p && p->symbol < K.ch[i]) p = p->next; //向右兄弟节点搜索 if (p && p->symbol == K.ch[i]){ //匹配成功 p = p->first; //向子节点搜素 ++i; //匹配关键字的下一个字符 }else{ //匹配失败 p = NULL; //查找不成功,强制退出循环 } } if (p && p->kind == LEAF) //查找成功则最后到达叶子节点,否则为NULL return p->infoptr; else return NULL; } ## 3 Trie树 ## 若以树的**多重链表**表示键树,则树的每个节点中应含有d个指针域,此时的键树又称为Trie树。若从键树中某个节点到叶子节点的路径上每个节点都只有一个孩子,则可将该路径上所有节点压缩成一个“叶子节点”,且在该叶子节点中存储关键字及指向记录的指针等信息。 **在Trie树中有两种节点:** * 分支节点:含有d个指针域和一个指示该节点中非空指针域个数的整数域。在分支节点中不设数据域,每个分支节点所表示的字符均有其父节点中指向该节点的指针所在位置决定。 * 叶子节点:含有关键字域和指向记录的指针域 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70 1] Trie树的查找过程为从根结点出发,沿和给定值相应的指针逐层向下直到叶子节点,若分支节点中和给定值相应的指针为空,或叶子节点中的关键字与给定值不符,则查找不成功。 typedef struct TrieNode{ NodeKind kind; union{ struct { KeysType K; Record * infoptr;}lf; //叶子节点 struct { TrieNode *ptr[27]; int num;}bh //分支节点 }; }TrieNode,*TrieTree; 查找代码 Record *SearchTrie(TrieTree T, KeysType K){ //在Trie树中查找关键字为K的记录 p=T; i=0; while(p && p->kind == BRANCH && i<K.num){ //在分支节点中向下查找匹配 p = p->bh.ptr[ord(K[i])]; //查找关键字K对应字符在分支节点中的位置 i++; } if(p && p->kind == LEAF && p->lf.K == K) return p->lf.infoptr; //查找成功 else return NULL; //查找失败 } 双链树和Trie树是键树的两种不同的表示方法,从其不同的存储结构来看,若键树中节点的度比较大,则采用Trie树节点较双链树更为合适。他们的查找过程都是从根节点出发,走了一条从根到叶子的路径,查找时间依赖于树的深度。因此,适当地调整对关键字的分割方案,例如先按首字符分割,再按尾字符分割,再按第二个字符…交替分割,缩减树的深度。 [20181219173409284]: /images/20220404/b87bb2642f7d4ebfb0a2efd0fb291f0f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70]: /images/20220404/d37c32525b0843298dd23a8da42817a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70 1]: /images/20220404/c9ed3a6d928d4b9d9c3d9c5bc13fe7ad.png
相关 字典树 字典树 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^\_^ 题目描述 遇到单词不认识怎么办? 查字 ゞ 浴缸里的玫瑰/ 2022年08月18日 02:28/ 0 赞/ 169 阅读
相关 字典树 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它 你的名字/ 2022年08月02日 14:59/ 0 赞/ 158 阅读
相关 字典树 Trie,又称字典树,前缀树(prefix tree),是一种树形结构,用于保存大量的字符串。 它的优点是:利用字符串的公共前缀来节约存储空间。查找、插入复杂度为O(n),n 电玩女神/ 2022年08月01日 00:08/ 0 赞/ 156 阅读
相关 字典树 Problem H: 位运算的游戏 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 4 Solved: 2 电玩女神/ 2022年07月15日 10:16/ 0 赞/ 151 阅读
相关 字典树 Problem Description 遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在 不念不忘少年蓝@/ 2022年07月12日 05:51/ 0 赞/ 194 阅读
相关 字典树 一、引入 [点击打开链接][Link 1] 字典是干啥的?查找字的。 字典树自然也是起查找作用的。查找的是啥?单词。 看以下几个题: 1、给出n个单词和m个询问 今天药忘吃喽~/ 2022年06月16日 08:21/ 0 赞/ 216 阅读
相关 字典树 题目链接:[点击打开链接][Link 1] 代码: include<iostream> include<cstring> using namespa 不念不忘少年蓝@/ 2022年05月30日 05:46/ 0 赞/ 176 阅读
相关 字典树 1 定义 键树又称数字查找树,它是一棵度大于2的树,树中的每个节点值含有组成关键字的符号。例如,若关键字是数值,则节点中只包含一个数位。若关键字是单词,则节点中只包含一个 r囧r小猫/ 2022年04月10日 01:47/ 0 赞/ 249 阅读
相关 字典树 字典树是一种以树这种结构为基础建立的算法 ,那么字典树到底有哪些典型的应用呢? 1.字典树在串的快速检索中的应用。 给出N个单词组成的熟词表,以及一篇全用小写英文 绝地灬酷狼/ 2022年03月19日 04:20/ 0 赞/ 240 阅读
相关 字典树 字典树 前言 利用指针实现 用数组实现 前言 介绍 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用 男娘i/ 2021年11月09日 15:52/ 0 赞/ 282 阅读
还没有评论,来说两句吧...