字符串处理----Trie树

         Trie树,又称单词查找树键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

 

特性:

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

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

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

下面的程序实现了对几个字符串统计出现的次数。

C语言实现:

 

#include<stdio.h>
#include<malloc.h>
#define NUMBER 26
#define WORD_LENGTH 15
 struct TrieNode
{
    int count;
    struct TrieNode * next[NUMBER];
};

struct TrieNode * root=NULL;

void Insert_TrieNode(char *chr)
{
    int index,i;

    struct TrieNode * cur =root,*node;

    while(*chr!='\0')
    {
        index= *chr-'a';

        if(cur->next[index]==NULL)
        {
            node=(struct TrieNode*)malloc(sizeof(struct TrieNode));

            node->count=0;

            for(i=0;i<NUMBER;i++)
            {
                node->next[i]=NULL;
            }
            cur->next[index]=node;

        }
        cur=cur->next[index];

        chr++;
    }
    cur->count++;
}

void Search_Word(char *chr)
{
    int index;
    char *ch=chr;

    struct	TrieNode * cur =root;
    while(*chr)
    {
         index = *chr-'a';
        if(cur->next[index]==NULL)
        {
            printf("Not find word %s in Trie Tree\n",chr);
            return;
        }
        cur=cur->next[index];
        chr++;
    }
    printf("Success,word %s=%d times\n",ch,cur->count);
}

void DFS_Trie(struct TrieNode *node,char *queue)
{
    int i;
    char *head=queue;
    for(i=0;i<NUMBER;i++)
    {
        if(node->next[i]!=NULL)
        {

            while(*queue!='\0')queue++;

            *queue=(char)(i+'a');
            queue=head;

            if(node->next[i]->count>0)
            {
                printf("%s\t%d\n",queue,node->next[i]->count);
            }
            //else
            //{
                DFS_Trie(node->next[i],queue);
            //}

            head=queue;
            while(*(queue+1)!='\0')queue++;

            *queue='\0';
            queue=head;
        }
    }
}

int main()
{
    int i;
    char *chr[]={"inn", "intt", "at", "age", "adv", "ant","age"};
    char *queue = (char*)calloc(WORD_LENGTH,sizeof(char));

    root = (struct TrieNode*)malloc(sizeof(struct TrieNode));

    for(i=0;i<NUMBER;i++)
    {
        root->next[i]=NULL;
    }

    for(i=0;i<7;i++)
    {
        Insert_TrieNode(chr[i]);
    }

    Search_Word("age");
    Search_Word("hello");

    DFS_Trie(root,queue);
    return 0;
}

void ToLower(char *ch)
{
    while(*ch!='\0')
    {
        if('A'<=*ch&&*ch<='Z')
            *ch=*ch+32;
        ch++;
    }
}

 

    原文作者:Trie树
    原文地址: https://blog.csdn.net/yong369044325/article/details/7868735
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞