数据结构4:Tire树入门

以下来源于百度百科:

在计算机科学中,Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。

特点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

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

例如:如给出字符串"abc","ab","bd","dda",根据该字符串序列构建一棵Trie树。则构建的树如下:
 

红色表示一个单词的结束。

Tire的三个基本性质:

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

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

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

Tire树的实现:

数组: 

const int N = 1e5+10;
int son[N][26], cnt[N], idx; // son存储Trie  cnt存储每个节点的单词数,idx为节点编号

// 插入
void insert(string str)
{
    int p = 0;
    for(int i=0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if(!son[p][u]) son[p][u] = ++idx;
        p = son[p][u];
    }
    cnt[p]++;
}

// 查询
int query(string str)
{
    int p = 0;
    for(int i=0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if(!son[p][u]) return 0;
        p = son[p][u];
    }
    return cnt[p];
}

 

 

结构体:

typedef struct TireNode{
    int count;                  // 统计单词前缀出现的次数
    struct TireNode *next[26];  // 用0~25 来表示a~z,存入时 相应的字符减一个'a'就行了。
    bool exist;                 // 记录是不是构成一个单词
}TireNode,*Tire;

TireNode* CreatTireNode()
{
   Tire node = new Tirenode;         //动态分配空间
   node->count=0;
   memset(node->next,0,sizeof(node->next));   
   return node;  
}
int main()
{
    tire root=CreatTireNode();
    
}

插入:

Void InsertTire(Tire root,char* word)
{
    Tire node=root;
    char *p=word;
    while(*p){
         if(node->nexe[*p-'a']==NULL)
         {
            node->next[*p-'a']=createTirenode();
         }
         node=node->next;
         p++;
         node->count+=1;
    }
     node->exist = true;
}

查找:

int TireSearch(Trie root,char*word)
{
    Tire node = root;
    char *p = word;
    int id;
    while(*p)
    {
        id=*p-'a';
        node=node->next[id];
        ++p;
        if(node==NULL)
            return 0;
    }
    return node->count;
}

 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值