Trie 树(一):简介

2019-03-03  本文已影响0人  蓝天白云bubble

本文内容主要来源:http://www.cnblogs.com/konrad/p/7746030.html

       一、基本概念
        Trie 树又称字典树、单词查找树、前缀树等,是一种树形结构。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计等。

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

       缺点:基于空间换时间的思想,所以系统中若存在大量的没有公共前缀的字符串则会消耗大量内存。

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

       三个特性:
       1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
       2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
       3. 每个节点的所有子节点包含的字符都不相同。
       例:and, as, at, cn, com构建的 Trie 树如下:


trie.png

       二、Trie 树的基本操作
       假设存在字符串 str,Trie树的根结点为 root,i=0,p=root

       1. 插入
       1) 取 str[i],判断 p->next[str[i]-'a'] 是否为空,若为空,则建立结点 temp,并将 p->next[str[i]-‘a’] 指向 temp,然后 p 指向 temp;若不为空,则 p=p->next[str[i]-'a'];
       2) i++,继续取 str[i],循环1) 中的操作,直到遇到结束符 '\0',此时将当前结点 p 中的 isStr 置为 true,表示从根节点到当前节点这条路径上的字符组成的字符串是一个词。

       2. 查找  
       1) 取 str[i],判断判断 p->next[str[i]-‘a’] 是否为空,若为空,则返回 false;若不为空,则 p=p->next[str[i]-'a'],继续取字符。
       2) 重复1)中的操作直到遇到结束符 '\0',若当前结点 p 不为空并且 isStr 为 true,则返回 true,否则返回 false。

       3. 删除
       可以递归删除整棵树

三、Trie 树的复杂度
       1. 插入、查找的时间复杂度均为 O(N), N为字符串的长度。
       2. 英文字符为例,空间复杂度是 26^n, 可采用<双数组实现>来改善。

四、Trie 树的应用场景
       1. 字符串检索、词频统计
       将已知的一些字符串(字典)的有关信息实现保存到 trie 树里,查找另外一些未知字符串是否出现过或者出现频率。

       2. 字符串最长公共前缀
       Trie 树利用多个字符串的公共前缀来节省存储空间,反之,当我们把大量字符串存储到一棵 trie 树上时,我们可以快速得到某些字符串的公共前缀。

       3. 排序
       只要先序遍历整棵树,输出相应的字符串便是按字典排序的结果。

上一篇:python3 通过 pymysql 操作 mysql 数据库
下一篇:Trie 树(二):java 简单实现

上一篇下一篇

猜你喜欢

热点阅读