理解字典树

字典树

百度百科:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统

用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

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

字符都不相同。

其基本操作有:查找、插入和删除,当然删除操作比较少见。


1.1   定义   动态申请内存

struct node    //这个看起来很强嘛。。。。。。虽然我没看懂  就是绑定的
{  
    int cnt;  
    struct node *next[26];  //26指小写字母,视情况而变
    node()
    {  
        cnt = 0;  
        memset(next,0,sizeof(next));  
    }  
};  
1.2  定义  静态申请内存

struct node  
{  
    int cnt;  
    struct node *next[10];  
    void init()  
    {  
        cnt = 0;  
        memset(next,0,sizeof(next));  
    }  
}Heap[100005];  
  
inline node* new_node()
{  
    Heap[cnt_node].init();  
    return &Heap[cnt_node++];  
}  
  
node *root = NULL;  

2   建树

void buildtrie(char *s)
{  
    node *p = root;  
    node *tmp = NULL;  
    int l = strlen(s);  
    for(int i = 0; i < l; i++)
    {  
        if(p->next[s[i]-'a'] == NULL)
        {  
            tmp = new node;  
            p->next[s[i]-'a'] = tmp;  
        }  
        p = p->next[s[i]-'a'];  
        p->cnt++;     // 统计数量  
    }  
}  


3  查找

void findtrie(char *s)
{  
    node *p = root;  
    int l = strlen(s);  
    for(int i = 0; i < l; i++)
    {  
        if(p->next[s[i]-'a'] == NULL)
        {  
            printf("0\n");  
            return;  
        }  
        p = p->next[s[i]-'a'];  
    }  
    printf("%d\n",p->cnt);  
}  

经典例题

hdu 1251 统计难题                   模板题

POJ 2001 Shortest Prefixes      给你一定数量的串,然后让你求出能分辨每一个串的最小前缀。

 用字典树存储每一个串,并作标记,直到找到一个标记 为1的字母,输出即可

POJ 2418 Hardwood Species   按字典序输出,每种树占所有树的百分比

 首先用字典树存所有树,再用dfs进行搜索

POJ 2503 Babelfish                  简单的一一映射关系


另:不要用G++交。。。。。。会Memory Limit Exceeded。。。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值