首页 > 其他 > 详细

hdu 1251 trie

时间:2014-03-28 18:31:26      阅读:516      评论:0      收藏:0      [点我收藏+]
 字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。


它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。

bubuko.com,布布扣
字典树的插入,删除和查找都非常简单,用一个一重循环即可。
1. 从根节点开始一次搜索
2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索
3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索
4. 迭代过程...
5. 在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找

字典树的应用
1.字典树在串的快速检索中的应用。
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

2. 字典树在“串”排序方面的应用
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可

3. 字典树在最长公共前缀问题的应用
对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为最近公共祖先问题。

 

字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。 



#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;

struct trie
{
    struct trie *child[26];
    int n;
};
struct trie *root;

void insert(char *source)
{
    int i,j;
    int len;
    struct trie *current,*newnode;
    len=strlen(source);
    current=root;
    for(i=0;i<len;i++){
        if(current->child[source[i]-‘a‘]!=0){
            current=current->child[source[i]-‘a‘];
            current->n++;
        }
        else{
            newnode=(struct trie *)malloc(sizeof(struct trie));
            for(j=0;j<26;j++) newnode->child[j]=0;
            current->child[source[i]-‘a‘]=newnode;
            current=newnode;
            current->n=1;
        }
    }
}

int search(char *source)
{
    int i;
    int len;
    struct trie *current;
    len=strlen(source);
    if(len==0) return 0;
    current=root;
    for(i=0;i<len;i++){
        if(current->child[source[i]-‘a‘]!=0){
            current=current->child[source[i]-‘a‘];
        }
        else return 0;
    }
    return  current->n;
}
/*
int Delete(char *source)
{
    stack<struct trie *> q;
    int i;
    int len;
    struct trie *current;
    len=strlen(source);
    if(len==0) return 0;
    current=root;
    for(i=0;i<len;i++){
        if(current->child[source[i]-‘a‘]!=0){
            q.push(current->child[source[i]-‘a‘]);
        }
        else return 0;
    }
    while(!q.empty()){
        
    }
}
*/
int main()
{
    char str[20];
    int i;
    root=(struct trie *)malloc(sizeof(struct trie));
    for(i=0;i<26;i++) root->child[i]=0;
    root->n=0;
    while(gets(str),strcmp(str,"")!=0){
        insert(str);
    }
    while(gets(str)){
        printf("%d\n",search(str));
    }
}


hdu 1251 trie,布布扣,bubuko.com

hdu 1251 trie

原文:http://blog.csdn.net/cnh294141800/article/details/22316653

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!