菜鸟级Trie树简介与简单实现。。。

原创 2016年08月31日 09:38:48

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

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

(以上来自百度百科)

如果我们有一个单词库,然后我们要从里面找词。。。用hash可以很快,但是浪费了很多空间,所以用Trie树,速度一样能到O(n),n是要查找的单词长度。

这就是一颗Trie树,根路径没有值,用#
表示,假如我们的单词库有这么几个单词

    string[] words = new string[] { 
        "ant",
        "at",
        "as",
        "cn",
        "com",
    };

那就对应这么一颗Trie树(来自画图。。。)

从根到叶子节点的值连起来就是一个单词,比如c->o->m,要查找at是否在单词库里,就从第一个字母a开始,找到a节点,下一个字母t,找a节点下是否有t,找到,说明at在,其它单词类似。

构建Trie树和查找过程差不多,代码附上:

//树节点
class TreeNode
{
    public char value = '#';
    public List<TreeNode> next = new List<TreeNode>();
}

class Class1
{
    string[] words = new string[] { 
        "ant",
        "at",
        "as",
        "cn",
        "com",
    };
    //构建Trie树
    public TreeNode Build()
    {
        TreeNode root = new TreeNode();
        //就是不停的添词
        for (int i = 0; i < words.Length; i++)
        {
            AddWord(words[i], root);
        }

        return root;
    }
    //这是主要的方法,把一个词添加到Trie树中
    public void AddWord(string word,TreeNode root)
    {
        TreeNode now = root;
        int i,j;
        for (j = 0; j < word.Length; j++)
        {
            bool has = false;
            char c = word[j];
            for (i = 0; i < now.next.Count; i++)
            {
                if (c == now.next[i].value)
                {
                        now = now.next[i];
                        has = true;
                        break;
                }
            }
            if (!has)
            {
                TreeNode t = new TreeNode();
                t.value = c;
                now.next.Add(t);
                now = now.next[i];
            }
        }
    }
    //查找一个词是否在Trie树中
    public bool Search(TreeNode root,string word)
    {
        TreeNode now = root;
        int i, j;
        for (i = 0; i < word.Length; i++)
        {
            char c = word[i];
            bool has = false;
            for (j = 0; j < now.next.Count; j++)
            {
                if (now.next[j].value == c)
                {
                    now = now.next[j];
                    has = true;
                    break;
                }
            }
            if (!has) return false;
        }
        return true;
    }

}

测试程序:

    static void Main(string[] args)
    {
        Class1 c1 = new Class1();
        TreeNode root=c1.Build();
        Console.WriteLine(c1.Search(root, "cn"));
        Console.WriteLine(c1.Search(root,"cnt"));
        Console.WriteLine(c1.Search(root, "com"));
        Console.WriteLine(c1.Search(root, "at"));
        Console.WriteLine(c1.Search(root, "b"));
        Console.ReadLine();
    }

输出结果:

synopsys 工具简介

                                                                                                 “ —...
  • palaciopku
  • palaciopku
  • 2010年04月20日 00:24
  • 405

程序员的分级理解

一个有理想有上进心的程序员应该对自己日常面对的系统和框架感兴趣! 任何一种移动开发生态系统其技术人员都是呈现金字塔式分布的。 我借此也说说Developer和P...
  • czh729188659
  • czh729188659
  • 2015年08月20日 14:41
  • 416

菜鸟的汇编语言学习笔记

1.1机器语言 计算机发展初期,人们都是用机器语言进行编程的,这也是人们能实现编程控制计算机的最低级别。那么机器语言是什么样子的呢?就是用0和1组成的一个串(形如011010101),cpu的每一个...
  • dl23041
  • dl23041
  • 2014年11月20日 14:29
  • 236

gulp菜鸟级零基础详细教程,嘴对嘴教会你怎么使用gulp

gulp菜鸟级零基础详细教程,嘴对嘴教会你怎么使用gulp 相信大家一定听说过gulp或者webpack,grunt等前端构建工具,这些是做什么用的我也不知道,也许他们会和一...
  • momoda111
  • momoda111
  • 2017年08月02日 18:02
  • 679

用二叉树实现Trie树

关于Trie树的简介,有点这里就不再罗嗦了,清
  • u010189459
  • u010189459
  • 2014年06月16日 23:48
  • 774

Trie树实现词频统计与查找

#encoding:utf-8 from collections import defaultdict import sys reload(sys) sys.setdefaultencoding('...
  • IqqIqqIqqIqq
  • IqqIqqIqqIqq
  • 2017年01月15日 14:56
  • 975

经典算法——hihocoder#1014 : Trie树(字典树)

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,...
  • geekmanong
  • geekmanong
  • 2016年03月24日 14:53
  • 1388

一个Trie树的简单实现

/*trial 树*/
  • xiaolewennofollow
  • xiaolewennofollow
  • 2016年03月15日 17:21
  • 471

支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

Trie树,也叫字典树、前缀树。可用于”predictive text”和”autocompletion”,亦可用于统计词频(边插入Trie树边更新或添加词频)。 在计算机科学中,trie,又称前缀...
  • yangxudong
  • yangxudong
  • 2014年10月28日 13:35
  • 2039

Trie树的常见应用大总结(面试+附代码实现)

(一)Trie的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。他的核心思想是空间换时间,空间消耗大...
  • NK_test
  • NK_test
  • 2015年08月21日 16:18
  • 6698
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:菜鸟级Trie树简介与简单实现。。。
举报原因:
原因补充:

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