字典树简单示例

原创 2012年03月30日 20:47:23
字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。
这题就是统计一组字符串中某前缀出现次数

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

#define MAX 26
#define LENTH 1000000
struct _Node{
        int nCount;
        struct _Node* next[MAX];
};
typedef struct _Node TrieNode;
TrieNode tn[LENTH];
int all=0;


//初始化
void init(TrieNode ** pRoot)
{
        *pRoot = NULL;

}
//创建新结点
TrieNode * createNode()
{
        int i;
        TrieNode * p;
        if(all < LENTH)p = &tn[all++];

        else return  NULL;
        p->nCount = 1;
        for(i = 0 ; i  < MAX ; ++i)
        {
            p->next[i] = NULL;
        }
        return p;

}
//插入
void insertNode(TrieNode **pRoot,char *s)
{
        TrieNode * p;
        if(!(p=*pRoot))
        {
           p=*pRoot=createNode();
        }
        int i,k;
        i = 0;
        while(s[i])
        {
           k = s[i]-'a';
           if(p->next[k])
                 p->next[k]->nCount++;
           else{
                p->next[k]=createNode();
           }
           p = p->next[k];
           ++i;
        }
}
//查找
int searchTrie(TrieNode ** pRoot, char *s)
{
        int i,k;
        TrieNode * p;
        if(!(p = *pRoot))return 0;
        i = 0;
        while(s[i])
        {
           k = s[i++]-'a';
           if(p->next[k])
           {
              p=p->next[k];
           }else{
             return 0;
           }
        }
        return p->nCount;
}
int main()
{
        printf("hello world\n");
        TrieNode * root;
        init(&root);
        char s[11];
        while(gets(s)&&s[0])
        {
           insertNode(&root,s);

        }
        printf("插入结束\n");
        while(gets(s))
        {
           printf("%d\n",searchTrie(&root,s));
        }
        return 0;
}

判断一组字符串中是否有一个字符串是另一个字符串的前缀(字典树第二类应用)。

我们只要在结点中添加一个nEndFlag成员变量即可。若nEndFlag == 1,说明该结点字符是某一字符串的结尾(假设为A),若在插入B字符串的过程中经过这一结点,则说明A是B的前缀;还有一种情况,当要插入最后一个字符c时,却发现p->next[c-'0']为真,则说明该字符串是一个前缀字符串,eg:先插入abcde,再插入abc这种情况

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

#define MAX 26
#define MAXLEN 1000000

struct _Node{
        int nEndFlag;
        struct _Node* next[MAX];
};
typedef struct _Node TrieNode;

TrieNode tn[MAXLEN];
int all = 0;
int nflag = 0;
void initTrie(TrieNode ** root)
{
        *root = NULL;
}
TrieNode * createNode()
{
        TrieNode *p;
        p = &tn[all++];
        p->nEndFlag = 0;
        int i ;
        for(i = 0;i < MAX ; ++i)
        {
           p->next[i] = NULL;
        }
        return p;
}
int  insertNode(TrieNode ** pRoot,char *s)
{
        TrieNode * p ;
        if(!(p = *pRoot))
        {
           p = *pRoot = createNode();
        }
        int i =0,k;
        while(s[i])
        {
           k = s[i++] - 'a';
           if(p->next[k])
           {
                if(p->next[k]->nEndFlag == 1 || s[i] == '\0')
                {
                     return 1;
                }
           }
           else
           {
                p->next[k] = createNode();
           }
           p = p->next[k];
        }
        p->nEndFlag = 1;
        return 0;
}
int main()
{
        printf("hello world\n");
        TrieNode * root;
        initTrie(&root);
        char s[11];
        int i, n;
        int flag = 0;
        scanf("%d",&n);
        getchar();
        printf("%d",n);
        for(i = 0;i < n; ++i)
        {
           gets(s);
           puts(s);
           printf("%d\n",i);
           if(flag == 0){
                flag = insertNode(&root,s);
           }
        }
        flag?printf("YES\n"):printf("NO\n");
        return 0;
}



                                                                      


字典树简介和简易应用

1、背景         词汇搜索、词频统计等字符串操作,是搜索引擎、文本处理系统等经常使用的业务,现在假设有这么一个简单的文本处理例子:有一篇10000个词的文章,要查出单词“was”在这篇文章中出...
  • ly01kongjian
  • ly01kongjian
  • 2013年03月31日 16:15
  • 3965

数据结构:字典树的基本使用

说来也奇怪,最近碰到的很多问题都需要用字典树来解决,索性就来研究一番。在这篇博客中,我会通过一些实例来讲解一下字典树的一些基本使用。例如:创建、添加、查找、按字典序排序、按数值大小进行排序(对于一些数...
  • u013761665
  • u013761665
  • 2015年10月19日 00:20
  • 4769

字典树数组实现

字典树是一种很实用也相对好理解的数据
  • u013588639
  • u013588639
  • 2014年08月06日 21:04
  • 1499

字典树C语言实现

字典树 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字...
  • Xiejunyi12
  • Xiejunyi12
  • 2016年01月30日 11:41
  • 2057

字典树题目总结

Trie 就好比维护了一个字典,可以在这个字典里插入删除字符串,也可以查询一个字符串是否在字典中。Trie的插入查找删除复杂度都是O(m)的,其中m为待插入串的长度。 Trie的原理是利用字符串...
  • yew1eb
  • yew1eb
  • 2014年02月17日 20:19
  • 2497

字典树算法详解

字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种。用于统计,排序和保存大量的字符串(也可以保存其 的)。 优点就是利用公共的前缀来节约存储空间。在这举个简单的例子:比如说...
  • piaocoder
  • piaocoder
  • 2015年08月21日 17:11
  • 3345

字典树 c++ 实现

字典树 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计。它...
  • rongdongzhu1
  • rongdongzhu1
  • 2015年09月13日 16:16
  • 993

01字典树 小结

为了做13年南京网络赛的一道题 学了这个01字典树 看了别人的模板 之后切了几道水题 现在总结一下01字典树的实现可以看成是把一个数的二进制字符化后插入到一颗一般的字典树中比如在01字典树种插入...
  • SolarDomo
  • SolarDomo
  • 2016年08月10日 10:15
  • 1225

Java实现字典树TrieTree

为了准备阿里的网上笔试,这几天回顾了数据结构.看到字典树时,突然发现四六级的高频词可以用字典树找出来的.(应该不会是一个一个数出来的吧....) 构造字典树的过程如下: 1.首先确定树节点需要用怎么样...
  • lc0817
  • lc0817
  • 2015年08月19日 13:04
  • 3403

字典树简介、应用以及与哈希表的比较

题目要求:1、设计并实现N-array trie,包括初始化,查找,插入,删除等。 2、应用trie结构实现文本文档的索引化,首先扫描文本文档,然后利用trie结构记录单词行号,最后在trie上实现查...
  • liyongqi_
  • liyongqi_
  • 2017年05月04日 22:07
  • 432
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字典树简单示例
举报原因:
原因补充:

(最多只允许输入30个字)