`
thd52java
  • 浏览: 72092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

前缀树

阅读更多

在计算机科学中,trie,又称前缀树, 是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都 有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有 相关的值。

 

Trie 这个术语来自于 retrieval。根据词源学,trie 的发明者 Edward Fredkin 把它读作/ˈtr/ "tree"。但是,其他作者把它读作 /ˈtr/ "try"。

 

在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。

 

键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示 trie 的原理。

 

 

trie 中的键通常是字符串,但也可以是其它的结构。trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如,bitwise trie 中的键是一串位元,可以用于表示整数或者内存地

 

 

 

Trie树是一种哈希树的变种,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

 

字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不 是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方 法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。

 

 

 

相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.

 

其基本性质可以归纳为:

 

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

 

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

 

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

 

其基本操作有:查找 插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.

 

搜索字典项目的方法为:

 

(1) 从根结点开始一次搜索;

 

(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

 

(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

 

(4) 迭代过程……

 

(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

 

其他操作类似处理.

#define MAX 26 //字符集大小
enum NODE_TYPE{
       DONE,  
       UNDONE
};


typedef struct TrieNode   {
     enum NODE_TYPE type  
     char ch;                            
     struct TrieNode *next[MAX]; //26-tree->a, b ,c, .....z  
}TrieNode;

  

/*初始化*/   
void InitTrieRoot(TrieNode **pRoot)   
{   
      *pRoot = NULL;   
}   


/*创建新结点*/   
TrieNode *CreateTrieNode(char ch)   
{   
       int i;   
       TrieNode *p = (TrieNode *)malloc(sizeof(TrieNode));      
       p->ch = ch;
         p->type= UNDONE;  
       for(i =0 ; i < MAX ; i++)   
       {   
            p->next[i] = NULL;   
       }   
       return p;   
}  
 

/*插入*/
void InsertTrie(TrieNode **pRoot , char *s)   
{   
       int i , k;   
       TrieNode *p;   
       if(!(p =*pRoot))   
       {   
            p =*pRoot = CreateTrieNode(' ');   
       }   
       i =0;
       for(i=0;*(s+i)!='\0';i++)
       {
            k=s[i]-'a'
            if(!p->next[k])
                  p->next[k] = CreateTrieNode(s[i]);
            p = p->next[k];
       }  
     
       p->type=DONE;   
}   

//查找   
int SearchTrie(TrieNode **pRoot , char*s)   
{   
       TrieNode *p;   
       int i , k;   
       if(!(p =*pRoot))   
       {   
             return 0;   
       }   
       i =0;   
       while(s[i])   
       {   
             k = s[i++] -'a';
             if(p->next[k] == NULL)
                      return   0;
             p = p->next[k];   
       }
  
       return (s[i] == '\0') && (p->type==DONE);   
}

分享到:
评论

相关推荐

    php-leetcode题解之实现前缀树.zip

    在解决LeetCode上的前缀树问题时,你可能会遇到各种变体,如查找所有以特定前缀开头的单词、统计特定模式的出现次数,或者构建最小覆盖前缀树等。这些题目将测试你对前缀树的理解以及使用PHP解决问题的能力。 通过...

    前缀树Unity红点系统

    前缀树Unity红点系统

    Go-一种快速的内存前缀树它使用uint64作为密钥并允许重复条目

    标题中的“Go-一种快速的内存前缀树它使用uint64作为密钥并允许重复条目”指的是一种在Go编程语言中实现的数据结构,称为前缀树(Trie,也叫字典树或PATRICIA树)。这种数据结构在处理大量字符串数据时非常高效,...

    AVL-红黑树-前缀树

    AVL树、红黑树和前缀树是数据结构与算法中的重要概念,它们在高效地存储和检索数据方面有着广泛的应用。以下是关于这三种数据结构的详细解释: 1. AVL树: AVL树是一种自平衡二叉搜索树,由G. M. Adelson-Velsky和E...

    每日一题:字符串高效查找-前缀树

    前缀树,也被称为字典树或Trie,是一种用于高效存储和检索字符串的数据结构。在信息技术和计算机科学中,前缀树常被用于搜索引擎、文本编辑器的自动补全功能、IP路由表等场景,因为它的设计允许快速查找具有相同前缀...

    Python算法题源代码-LeetCode(力扣)-实现 Trie (前缀树)

    Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。 这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。 ...

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

    ### IT笔试面试--Trie树(前缀树)常考题目及解析 #### 概述 Trie树,又称字典树或前缀树,是一种用于快速检索的多叉树结构,广泛应用于字符串处理领域。它能有效地利用字符串的公共前缀来减少存储空间,并在查询...

    python-leetcode面试题解之第208题实现前缀树-题解.zip

    在本压缩包中,我们关注的是Python编程语言与LeetCode面试题目的结合,特别是第208题,它涉及到“实现前缀树”这一数据结构。前缀树,也称为字典树或Trie,是一种用于高效存储和检索字符串的数据结构。在本题解中,...

    基础08前缀树和贪心算法.flv.zip

    前缀树,又称Trie树或字典树,是一种用于高效存储和检索字符串的数据结构。在计算机科学中,它常被用于实现自动补全、关键词搜索等功能。前缀树通过将字符串分解为字符序列,并在树结构中进行存储,使得查询操作可以...

    php-leetcode题解之实现Trie前缀树.zip

    Trie,也被称为字典树或前缀树,是一种用于存储字符串的数据结构,尤其适合进行高效的字符串查找。它的主要特点是能通过字典序的方式快速地查找具有相同前缀的字符串。Trie树的每个节点通常包含一个字符,并且有指向...

    C++前缀树trie的实现

    C++实现的前缀树trie数据结构

    基于Python实现的拼音分词器,将连续的拼音切分为单字拼音列表,开箱即用,基于前缀树(PyTrie)把连续拼音切分为单字拼音

    这里我们关注的是一个基于Python实现的拼音分词器,该工具利用前缀树(PyTrie)数据结构来高效地完成拼音切分任务。 首先,让我们深入理解“前缀树”(Trie)这个概念。前缀树,又称字典树或PAT树,是一种用于存储...

    C#前缀树红点系统源码.zip

    本压缩包"**C#前缀树红点系统源码.zip**"中包含的是一个使用C#实现的前缀树(也称为Trie树)和“红点系统”的源代码。前缀树是一种数据结构,用于高效地存储和检索字符串集合中的数据。而“红点系统”可能是指一种...

    leetcode卡-TrieTree:前缀树

    前缀树,也被称为Trie树或字典树,是一种用于存储字符串的数据结构,它能够高效地进行前缀匹配查询。在LeetCode中,前缀树是解决一系列问题的关键工具,尤其是在处理字符串相关的搜索和过滤任务时。在这个“TrieTree...

    实现 Trie (前缀树).md

    实现 Trie (前缀树).md

    Unity中基于前缀树的红点系统实现 (Unity + Lua + Prefix Tree) 红点系统.zip

    Unity中基于前缀树的红点系统实现 (Unity + Lua + Prefix Tree) 红点系统是在大部分游戏中都能看到的常见功能需求。在相关的UI上亮起红点来提示玩家进行相关操作。 项目基于UnityXFramework框架,集成tolua,使用lua...

    使用前缀树(trie tree) 实现敏感词过滤,使用c++实现,性能优异

    前缀树实现的敏感词查找,时间复杂度为 O(kM), k为一小常数,M为文本长度。 该资源提供了c 的dll库,各种语言均可调用,有示例demo,该库在线上IM场景中 10w+敏感词过滤时实时性禁得起考验。

Global site tag (gtag.js) - Google Analytics