Trie树

原创 2016年05月31日 10:48:51

1.1      什么是trie树

Trie树,即字典树,又称单词查找树或前缀树,

是一种用于快速检索的多叉树结构。

        Trie一词来自retrieve, 发音为 /tri:/ “tree”,也有人读为/trai/ “try”.

       优点:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

        缺点:内存消耗大。

Trie树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

Trie树的3个基本性质:

    1). 根节点不包含字符,其它节点都只包含一个字符

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

    3). 每个节点的所有子节点包含的字符都不相同。

根据这些性质,可以设计出trie树的结构类型:

#define MAX_OUT_DEGREE 26

enum TRIE_TYPE {

     COMPLETED,

     UNCOMPLETED

};

struct Trie_s {

     char c;   /*单一字符*/

     struct Trie_schild[MAX_OUT_DEGREE];/*子节点数组*/

     enum TRIE_TYPEtype;  /*标识是不是一个节点的结束*/

};



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_OUT_DEGREE 26
enum TRIE_TYPE {
    COMPLETED,
    UNCOMPLETED
};
struct Trie_s {
    char c;   /*单一字符*/
    struct Trie_s *child[MAX_OUT_DEGREE];/*子节点数组*/
    enum TRIE_TYPE type;  /*标识是不是一个节点的结束*/ 
};
typedef struct Trie_s * Trie_t;
Trie_t createNewTrieNode(char ch)
{
    Trie_t trie;
    unsigned int i;
    trie = (Trie_t)malloc(sizeof(struct Trie_s));
    if(trie == NULL) {
        printf("malloc error in createNewTrieNode\n");
        return NULL;
    }
    trie->c = ch;
    trie->type = UNCOMPLETED;
    for(i = 0; i < MAX_OUT_DEGREE;i++) {
        trie->child[i] = NULL;
    }
    return trie;
}
Trie_t initialization() {
    Trie_t root;
    root = createNewTrieNode(' ');
    return root;
}
unsigned int chartoindex(unsigned char ch)
{
    return ch-'a';
}
void insert(const char string[],unsigned int len,Trie_t root)
{
    unsigned int i;
    unsigned int index;
    Trie_t trie;
    if(root == NULL) {
        printf("the trie tree is empty\n");
        return;
    }
    trie = root;
    /*假设字符串都是从a-z和A-Z的字母*/
    for(i = 0; i < len; i++) {
        index = chartoindex(string[i]);
        if(NULL == trie->child[index]) {
            trie->child[index] = createNewTrieNode(string[i]);
        }   
        trie = trie->child[index];
    }
    trie->type = COMPLETED;
}

Trie_t find(const char string[],unsigned int len,Trie_t root)
{
    Trie_t trie;
    unsigned int i = 0;
    unsigned int index;
    if(root == NULL) {
        printf("the trie tree is empty\n");
        return NULL;
    }
    trie = root;    
    while(i < len) {
        index = chartoindex(string[i++]);
        if(trie->child[index] == NULL) {
            return NULL;
        }
        trie = trie->child[index];
    }
    if(trie->type == COMPLETED) {
        return trie;
    }
    return NULL;
}
void delete(Trie_t root)
{
    unsigned int i;
    Trie_t trie;
    if(root == NULL)
        return;
    trie = root;
    
    for(i = 0; i < MAX_OUT_DEGREE;i++) {
        if(trie->child[i]) {
            delete(trie->child[i]);
        }
    }
    free(trie);
    trie = NULL;
}
int main(int argc, char *argv[])
{
    Trie_t trie;
    trie = initialization();
    if(trie == NULL) {
        printf("trie is empty in main\n");
        return -1;
    }
    insert("abcd",strlen("abcd"),trie);
    insert("cef",strlen("cef"),trie);
    insert("higk",strlen("higk"),trie);

    if(find("cef",strlen("cef"),trie) != NULL) {
        printf("find cef in the trie\n");
    }else {
        printf("can't find cef in the trie\n");
    }

    if(find("acef",strlen("acef"),trie) != NULL) {
        printf("find acef in the trie\n");
    }else {
        printf("can't find acef in the trie\n");
    }
    return 0;
}





Trie实践:一种比哈希表更快的数据结构

本文乃Siliphen原创。转载请注明出处:http://blog.csdn.net/stevenkylelee 先考虑一下这个问题:如何统计5万个0-99范围的数字出现的次数? 可以用哈希表来进...
  • StevenKyleLee
  • StevenKyleLee
  • 2014年08月02日 06:19
  • 8362

字典树(Trie树)用法及例子(一)

字典树(Trie)概述字典树,又名Trie树。顾名思义,在字典中很好用。我们在查牛津词典时都是先按第一个字母找到以这个字母为首的单词所在的初始位置,在此位置的基础上,再按照第二个字母继续找。。。 插...
  • u010902721
  • u010902721
  • 2015年05月15日 20:53
  • 3857

java实现的Trie树数据结构

最近在学习的时候,经常看到使用Trie树数据结构来解决问题,比如“ 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。” 该如何解决...
  • abcd_d_
  • abcd_d_
  • 2014年10月15日 20:37
  • 5696

DoubleArrayTrie(双数组Trie树)

  • 2015年10月22日 09:57
  • 2.13MB
  • 下载

trie树模板,acm竞赛

  • 2010年03月12日 08:14
  • 2KB
  • 下载

trie树实现英语词典

  • 2008年09月15日 15:38
  • 200KB
  • 下载

IT笔试面试--Trie树前缀树常考题目及解析

  • 2013年04月14日 20:12
  • 44KB
  • 下载

Trie树 linux32 SDK V3.0

  • 2010年04月18日 17:25
  • 238KB
  • 下载

Acm Trie树

  • 2014年04月06日 10:28
  • 45KB
  • 下载

C#编写的Trie树操作

  • 2015年04月09日 08:34
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Trie树
举报原因:
原因补充:

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