Trie,又称字典树、单词查找树,是一种树形结构

转载 2007年10月15日 20:37:00
原贴:http://blog.csdn.net/Terro/archive/2007/08/15/1745699.aspx

Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。

它有3个基本性质:

1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3. 每个节点的所有子节点包含的字符都不相同。

Trie的实现见下面的代码,具体操作见注释。这个写的有些垃圾,期待改进。

 

//结点类型
typedef struct node
...{
    
bool isStr;    //记录此处是否有串,目的是:如果插入"abc",那么"ab"如果不作标记的话,也是存在的
    int count;    //记录子结点的个数
    node* next[26];    //孩子的指针
    node()
        : count(
0), isStr(false)
    
...{
        memset(next, NULL, 
sizeof(next));    //初始化为空
    }

}
 *nodeptr;
//Trie类
//insert:插入一个字符串,重复插入无效
//remove:删除指定的字符串,如果不存在,则不进行操作
//find:判断是否有指定的字符串
class Trie
...{
private:
    nodeptr root;
    
//删除t的孩子的孩子
    
//这样做的原因是
    
//delete一个指针,这个指针就不确定了,不能继续向上操作
    
//所以只能删除t的孩子的孩子
    
//有待改进
    void remove(nodeptr t, const char* key, int i)
    
...{
        
//孩子的指针,key[i]为孩子
        nodeptr pnext = t -> next[key[i] - 'a'];
        
if (key[i+1&& pnext)    //不是最后一个结点
        ...{
            pnext 
-> count--;
            remove(pnext, key, i
+1);    //递归删除
        }

        
if (!pnext -> count)    //子结点是空的,直接删除
            delete pnext;
        
else    //否则删除子结点的孩子的指针
            pnext -> next[key[i+1- 'a'= NULL;
    }

public:
    Trie()
    
...{
        root 
= new node;
    }

    
//插入操作
    void insert(const char* key)
    
...{
        nodeptr location 
= root;
        
do
        
...{
            
if (location -> next[*key - 'a'== NULL)    //不存在则新建
            ...{
                nodeptr tmp 
= new node;
                location 
-> next[*key - 'a'= tmp;
            }

            
if (*key)    //不是0
            ...{
                location 
-> count++;
                location 
= location -> next[*key - 'a'];
            }

        }
 while (*key++);
        location 
-> isStr = true;    //到达尾部
    }

    
//删除操作
    void remove(const char* key)
    
...{
        
if (!find(key))    //找不到则不操作
            return;
        
//预处理根
        root -> count--;
        
//删除根的子结点
        remove(root, key, 0);
        
//尾处理
        if (!root -> next[*key - 'a'-> count)
            delete root 
-> next[*key - 'a'];
        
else
            root 
-> next[*key - 'a'= NULL;
    }

    
//查找
    bool find(const char* key)
    
...{
        nodeptr location 
= root;
        
while (*key && location)
            location 
= location -> next[*key++ - 'a'];
        
return (location != NULL && location -> isStr);
    }

}
;


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1745699

 

Trie 树(又称字典树,单词查找树)

Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。   Tr...
  • arhaiyun
  • arhaiyun
  • 2013年09月23日 02:14
  • 7413

字典树的实现(Python)

接着上一篇字典树结构的讲解,我们接着使用C++和Python来实现字典树。在LeetCode 208 要求实现字典树。...
  • fred1653
  • fred1653
  • 2016年04月26日 23:54
  • 2217

前缀树(Trie)原理及Java实现

前缀树的结构Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。如下图: 上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “te...
  • u013309870
  • u013309870
  • 2017年05月02日 15:43
  • 1628

Trie 树(又称字典树,单词查找树)

原文地址:http://blog.csdn.net/arhaiyun/article/details/11913501 Trie 树, 又称字典树,单词查找树。它来源于retrieval(检...
  • jfhdd
  • jfhdd
  • 2016年10月14日 21:31
  • 118

Trie 前缀树/字典树/单词查找树(数据结构)

写完了KMP算法的博客之后,我下定决心,一定要写出一篇关于“AC自动机的博客”。AC自动机实际上就是字典树上的KMP算法。所以,考虑到广大同学不一定会写Trie树,特此在此处写了一篇文章介绍介绍这种数...
  • GGN_2015
  • GGN_2015
  • 2017年03月28日 08:13
  • 380

高级树形结构之字典树(Trie)

1.定义 字典树又称单词查找树,前缀树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点...
  • u010025211
  • u010025211
  • 2015年08月19日 21:11
  • 301

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表。前半部分跳跃表性质和操作的介绍直接摘自《让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用》上海市华东师范大学第二附属中学 魏冉。之后将附上...
  • zhongwen7710
  • zhongwen7710
  • 2014年09月14日 22:10
  • 2423

字典树_Trie树_单词查找树

如果你觉得这篇博客对你有所帮助, 请在左边点个赞吧: ) 下面我们先提出几个问题: 已知有n个长度不等的母串, 以及一个长度为m的模式串, 求该模式串是否为其中一个母串的前缀. 这个问...
  • wjh2622075127
  • wjh2622075127
  • 2018年01月10日 19:30
  • 9

字典树(Trie查找单词再也不用担心超时了)

字典树(Trie查找单词再也不用担心超时了)  字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字...
  • wzningjie
  • wzningjie
  • 2013年09月12日 13:23
  • 553

字典树(Trie) 之 统计单词的个数

#include #include using namespace std; const int maxn = 256;// typedef struct TrieNode { ...
  • u010700335
  • u010700335
  • 2014年08月29日 20:54
  • 654
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Trie,又称字典树、单词查找树,是一种树形结构
举报原因:
原因补充:

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