词条 | 字典树 |
释义 | 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 性质它有3个基本性质: 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符都不相同。 基本操作其基本操作有:查找 插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单. 实现方法搜索字典项目的方法为(1) 从根结点开始一次搜索; (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索; (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。 (4) 迭代过程…… (5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。 其他操作类似处理 应用串的快速检索给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。 在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。 “串”排序给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出 用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。 最长公共前缀问题对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为最近公共祖先问题(以后补上)。 字典树基本模板#define MAX 26 //字符集大小 typedef struct TrieNode { int nCount; //记录该字符出现次数 struct TrieNode *next[MAX]; }TrieNode; TrieNode Memory[1000000]; int allocp =0; /*初始化*/ void InitTrieRoot(TrieNode **pRoot) { *pRoot = NULL; } /*创建新结点*/ TrieNode *CreateTrieNode() { int i; TrieNode *p; p =&Memory[allocp++]; p->nCount =1; for(i =0 ; i < MAX ; i++) { p->next[i] = NULL; } return p; } /*插入*/ void InsertTrie(TrieNode **pRoot , char*s) { int i , k; TrieNode *p; if(!(p =*pRoot)) { p =*pRoot = CreateTrieNode(); } i =0; while(s[i]) { k = s[i++] -'a'; //确定branch if(p->next[k]) p->next[k]->nCount++; else p->next[k] = CreateTrieNode(); p = p->next[k]; } } //查找 int SearchTrie(TrieNode **pRoot , char*s) { TrieNode *p; int i , k; if(!(p =*pRoot)) { return0; } i =0; while(s[i]) { k = s[i++] -'a'; if(p->next[k] == NULL) return0; p = p->next[k]; } return p->nCount; } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。