`
jaychang
  • 浏览: 736580 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

Trie树 单词查找树 键树

阅读更多

转自:http://zh.wikipedia.org/wiki/%E7%B4%A2%E5%9B%9E%E6%A0%91

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

性质

它有3个基本性质:

  1. 根节点 不包含字符 ,除根节点外每一个节点都只包含一个字符
  2. 根节点 到某一节点路径 上经过的字符 连接起来,为该节点 对应的字符串
  3. 每个节点 的所有子节点 包含的字符 都不相同。

图示

这是一个Trie结构的例子: Trie example.svg

在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串,仅占用8个字节 (不包括指针 占用的空间)。

实例

这是一个用于词频统计的程序范例,因使用了getline(3),所以需要glibc 才能链接成功,没有glibc 的话可以自行改写。代码由User:JohnBull 捐献,遵从GPL版权声明。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define TREE_WIDTH 256
 
#define WORDLENMAX 128
 
struct trie_node_st {
        int count;
        struct trie_node_st *next[TREE_WIDTH];
};
 
static struct trie_node_st root={0, {NULL}};
 
static char *spaces=" \t\n/.\"\'()";
 
static int
insert(const char *word)
{
        int i;
        struct trie_node_st *curr, *newnode;
 
        if (word[0]=='\0') {
                return 0;
        }
        curr = &root;
        for (i=0; ; ++i) {
                if (curr->next[ word[i] ] == NULL) {
                        newnode=(struct trie_node_st*)malloc(sizeof(struct trie_node_st));
                        memset(newnode, 0, sizeof(struct trie_node_st));
                        curr->next[ word[i] ] = newnode;
                }
                if (word[i] == '\0') {
                        break;
                }
                curr = curr->next[ word[i] ];
        }
        curr->count ++;
 
        return 0;
}
 
static void
printword(const char *str, int n)
{
        printf("%s\t%d\n", str, n);
}
 
static int
do_travel(struct trie_node_st *rootp)
{
        static char worddump[WORDLENMAX+1];
        static int pos=0;
        int i;
 
        if (rootp == NULL) {
                return 0;
        }
        if (rootp->count) {
                worddump[pos]='\0';
                printword(worddump, rootp->count);
        }
        for (i=0;i<TREE_WIDTH;++i) {
                worddump[pos++]=i;
                do_travel(rootp->next[i]);
                pos--;
        }
        return 0;
}
 
int
main(void)
{
        char *linebuf=NULL, *line, *word;
        size_t bufsize=0;
        int ret;
 
        while (1) {
                ret=getline(&linebuf, &bufsize, stdin);
                if (ret==-1) {
                        break;
                }
                line=linebuf;
                while (1) {
                        word = strsep(&line, spaces);
                        if (word==NULL) {
                                break;
                        }
                        if (word[0]=='\0') {
                                continue;
                        }
                        insert(word);
                }
        }
 
/* free(linebuf); */
 
        do_travel(&root);
 
        exit(0);
} 


分享到:
评论

相关推荐

    Go-trie-单词查找树实现Go实现

    在这个背景下,了解并掌握如何在Go中实现Trie(单词查找树)这种数据结构对于提升代码质量具有重要意义。 Trie,又称为前缀树或字典树,是一种用于存储动态集合或关联数组的树形数据结构。它的主要特点是通过键的...

    基于Trie树模仿谷歌百度搜索框提示

    每当用户键入一个字符时,我们会调用Trie树的查找方法,获取所有匹配当前前缀的单词,并将这些单词显示在搜索框下方作为提示。为了优化用户体验,可以设置一个最小的触发字符数,例如3个,避免过多的提示干扰用户。 ...

    trie树的实现(C)

    在trie.c中,关于查找定义了两个函数,一个是find(),一个是search(),二者的区别是,前者仅判断一个字符串是否在树中出现,而后者除了判断字符串是否出现,还会判断待查找的字符串是否是一个合法的单词。

    HASH(Trie)-.rar_HashTree.h_TRIE_hash树_trie树_字典树

    在 HashTrie 中,每个节点包含一个哈希表,表中的键是 Trie 树中的字符,值是对应的子节点。当插入一个新的字符串时,我们从根节点开始,对每个字符应用哈希函数,得到对应的槽位,然后在该槽位下创建或查找子节点。...

    从trie树谈到后缀树

    例如,给定100000个长度不超过10的单词,如果使用Trie树,可以快速判断一个单词是否存在于集合中,并找到其首次出现的位置。使用哈希表虽然也能解决这个问题,但面对前缀查询等复杂需求时,Trie树的优势更为明显。 ...

    Acm Trie树

    Trie树支持多种操作,主要包括插入、查找和删除。 - **插入操作**:根据字符串逐个字符创建或链接节点,最后将最后一个节点的`isStr`设置为`true`。 - **查找操作**:从根节点开始,沿着字符路径向下遍历,如果到达...

    Trie树题解1

    利用Trie树,我们可以先构建一个包含所有单词的树,然后对矩阵的每个位置进行深度优先搜索或广度优先搜索,检查当前位置及周围位置组成的字符串是否为树中的单词。 3. POJ2001 - 这题需要找到每个单词的最短前缀,...

    从Trie树(字典树)谈到后缀树.pdf

    Trie树适合解决单词查找以及统计问题,而后缀树则在字符串模式匹配、最长公共子串等问题上有着出色的表现。 首先,Trie树是一种树形结构,用于高效存储和检索字符串数据集中的键。它能够快速查找字符串是否出现以及...

    trie树所有代码,试题打包

    Trie树是一种有序树,每个节点代表一个字符串的前缀,根节点不包含任何字符,而叶子节点代表完整单词。通过这种结构,我们可以快速查找具有特定前缀的字符串,且插入和查询的时间复杂度接近O(k),其中k是查询字符串...

    C#,单词查找树(Trie Tree)的插入与搜索算法与源代码

    C#,单词查找树(Trie Tree)的插入与搜索算法与源代码 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统...

    数据结构课设Trie树

    与传统的二叉查找树不同,Trie树以字符串为键,每个节点代表一个字符串的前缀。根节点通常不包含任何字符,而从根节点到叶子节点的路径上的边代表了字符串中的字符,路径上的字符组合起来就是该节点对应的关键字。...

    数据结构实验报告-----trie树

    3. **查找元素**:`SearchString`函数用于查找Trie树中是否存在某个单词。它同样逐字符地遍历单词,检查每个字符对应的子节点,如果遍历到最后一个字符且该节点存在,说明单词存在于Trie树中。 4. **查找单词前缀...

    35丨Trie树:如何实现搜索引擎的搜索关键词提示功能?1

    在Trie树中查找字符串,如"her",将字符串拆分成字符,从根节点开始逐个匹配,匹配路径以绿色表示。若查找的字符串是"he",匹配路径同样从根节点开始,但到达"e"节点时,由于"e"不是红色节点,表示"he"仅是部分匹配...

    Trie树的插入、查询、删除和部分应用(单词的查询、单词出现频率/DFS和非DFS两种遍历)

    在Trie树中,BFS通常用于查找最短匹配的单词,因为它是按字母顺序访问节点的。 在这个项目中,`main.cpp`可能是实现这些功能的主程序,`TrieTree.cbp`是工程文件,`main.exe`是编译后的可执行文件,`TrieTree....

    算法-单词查找树(信息学奥赛一本通-T1337)(包含源程序).rar

    单词查找树,又称为Trie或前缀树,是一种用于存储动态集合或关联数组的高效数据结构。它通过将字符串的关键字映射到树的节点,使得字符串的查找、插入和删除操作能够以接近线性的平均时间复杂度完成。这种数据结构在...

    一个基于trie树的具有联想功能的文本编辑器.zip

    3. **查找操作**:设计一个方法来查找以特定前缀开头的单词,通过遍历Trie树来实现。 4. **删除操作**(可选):如果需要支持删除单词功能,那么需要实现一个删除方法,这通常比插入和查找复杂,因为它需要处理节点...

    TIRE 字典树 论文

    3. **前缀匹配**:Trie树特别适合进行前缀匹配查询,例如查找所有以特定字符串开头的单词。 4. **插入和删除操作**:Trie树的插入和删除操作相对复杂,但仍然比平衡二叉搜索树等其他数据结构更为高效。 在论文...

    Trie树(字典树)的介绍及Java实现

    对于大规模字符串集合,尤其是有大量公共前缀的情况,Trie树的性能优于传统的哈希表或二叉查找树。在内存有限的情况下,Trie树可以有效地压缩存储空间,因为它共享了公共前缀,减少了重复存储。 总结来说,Trie树是...

    字典树查找统计及单词

    在这个场景中,标题“字典树查找统计及单词”指的是利用字典树进行单词查找、统计以及可能的分析操作。描述中的“将一些大型的英文文件建立一个结构来实现查找与分析”进一步明确了我们是通过字典树处理大量文本数据...

Global site tag (gtag.js) - Google Analytics