面试-数据结构-trie树

一、定义及使用场景

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

特点:

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

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

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

4、每个节点最多有26个孩子节点(存储26个字母)

变种:bit-wise Trie,用bit位存储26个字母

二、C实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Tnode{
    char ch;                    // 存储字符
    struct Tnode *child[26];    // 最多26个孩子结点点
    int iscomplete;             // 是否为一个单词的终点
}tree;

tree *createTree()
{
    tree *root = NULL;
    int i = 0;
    root = (tree *)malloc(sizeof(tree)); 
    if (root != NULL)
    {
        for (i; i < 26; i++)
        {
            root->child[i] = NULL;
        }
        
        root->iscomplete = 0;
    }

    return root;
}


int searchTree(char *str, tree *root)
{
    tree *found = NULL;
    int slen = 0;
    int loop = 0;   
    int value = 0;

    if (str == NULL || root == NULL)
        return 0;
    
    slen = strlen(str);
    found = root;

    for(loop; loop < slen; loop++)
    {
        value = str[loop] - 'a';     
        if (found->child[value] == NULL) 
            return 0;

        found = found->child[value];
    }
 
    if (found->iscomplete == 1)
        return 1;
    else 
        return 0;
}

int insert(char *str, tree *root)
{
    if (root == NULL || str == NULL)
        return 0;

    tree *p = NULL;
    int len = strlen(str);        
    int loop = 0;
    int value = 0;

    p = root;
    
    for (loop; loop < len; loop++)
    {
        value = str[loop] - 'a';

        if (p->child[value] == NULL)
        {
            p->child[value] = createTree();    
            p->child[value]->ch = str[loop]; 
        }
        
        p = p->child[value];
    }
    
    p->iscomplete = 1;

    return 1;
}


int main()
{
    tree *root = createTree();
    
    printf("%d\n", insert("read", root));
    printf("%d\n", insert("reader", root)); 
    printf("%d\n", insert("window", root)); 
    
    printf("%d\n", searchTree("read", root));
    printf("%d\n", searchTree("window", root));
    printf("%d\n", searchTree("baeg", root));
}

三、应用场景

(1) 字符串检索
事先将已知的一些字符串(字典)的有关信息保存到trie树里,查找另外一些未知字符串是否出现过或者出现频率。

(2)文本预测、自动完成,see also,拼写检查

(3)词频统计

(4)排序

Trie树是一棵多叉树,只要先序遍历整棵树,输出相应的字符串便是按字典序排序的结果。
(5)字符串最长公共前缀
Trie树利用多个字符串的公共前缀来节省存储空间,当我们把大量字符串存储到一棵trie树上时,我们可以快速得到某些字符串的公共前缀。

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

(7) 作为其他数据结构和算法的辅助结构
如后缀树,AC自动机等

后缀树可以用于全文搜索

参考:http://www.hankcs.com/nlp/performance-comparison-of-several-trie-tree.html

参考:https://www.cnblogs.com/bonelee/p/8830825.html

参考:https://blog.csdn.net/stpeace/article/details/107702982

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值