首页 > 其他分享 >字典树

字典树

时间:2023-01-05 17:37:24浏览次数:35  
标签:cur Trie isEnd next public 字典

字典树

概念

又称单词查找树,Trie(读法类似try)树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计

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

应用

  • 串的快速检索
    给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
    在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。
  • “串”排序
    给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
    用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。
  • 最长公共前缀
    对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为当时公共祖先问题。

以上内容摘自百度百科;

Java实现

import java.util.HashMap;
import java.util.Map;

public class Trie {
    private Map<Character, Trie> next;  // 更为通用的写法, 比用数组来表示孩子结点节约空间
    private boolean isEnd;
    public Trie() {
        this.next = new HashMap<>();
        this.isEnd = false;
    }
    public void insert(String word) {
        Trie cur = this;  // 获取根节点
        for(char c : word.toCharArray()) {
            if(cur.next.get(c) == null) // 如果该结点的孩子结点中无此字符, 则插入
                cur.next.put(c, new Trie());
            cur = cur.next.get(c); // 返回c对应的Trie对象
        }
        cur.isEnd = true; // 字符串结束位置字符的isEnd设为true, 表名字符串在这里结束
    }

    public boolean search(String word) {
        Trie endNode = searchPrefix(word);
        return endNode != null && endNode.isEnd;
    }

    public boolean startsWith(String prefix) {
        Trie res = searchPrefix(prefix);
        return res != null;
    }
    private Trie searchPrefix(String prefix) {
        Trie cur = this;
        for(char c : prefix.toCharArray()) { // 类似插入过程
            if(cur.next.get(c) == null) return null;
            cur = cur.next.get(c);
        }
        return cur;
    }
}

标签:cur,Trie,isEnd,next,public,字典
From: https://www.cnblogs.com/miao123-blog/p/17028297.html

相关文章

  • python字典推导式生成法用法
    prices={"aaa":166,"bbb":56,"cdfsa":133,"fs":22,"Sy":233.34}#生成式(推导式)的用法#用股票价格大于100元的股票构造一个新的字典prices......
  • list与字典
    1·关于C#从一个List复制到另一个List的简便写法。https://blog.csdn.net/carlblack1987/article/details/1161437992·C#List复制https://www.cnblogs.com/therock/a......
  • 213. 字典序最小问题 Best Cow Line(挑战程序设计竞赛)
    地址https://www.papamelon.com/problem/213给定一个字符SS,长度为NN。由SS构成出新的字符串TT,长度也为NN。起初TT是一个空串,然后执行NN次操作,每次操作有两种......
  • python中字典介绍
    #字典学习可变容器模型#创建字典的字面量语法scores={'刘德华':95,'白元芳':78,'狄仁杰':82}print(scores)#{'刘德华':95,'白元芳':78,'狄仁杰':82}......
  • python字典中dict.get()和dict.setdefault()的异同点
    1.相同点:两者是参数相同:dict.get(key,default=None),dict.setdefault(key,default=None)如果指定的键不存在时,两者都返回默认值,默认是None如果指定的键存在时,即使......
  • 利用VBA字典实现单条件,结果多值查询
    来源:利用VBA字典实现单条件,结果多值查询-知乎(zhihu.com)很好的利用字典数据类型 利用VBA字典实现单条件,结果多值查询VBA语言专业教育分享成果,随喜......
  • python读取文本中的字典
    首先得明确文本的每行是存的json或者用python的write(str(一个字典))写入的,那么不用借助json模块就能读取为字典,使用eval函数就行,json只能处理带双引号的字符串,但很多时候......
  • SQLite3返回字典格式数据
    参考链接代码块defdict_factory(cursor,row):d={}foridx,colinenumerate(cursor.description):d[col[0]]=row[idx]returndcon=s......
  • Chapter_6_字典
    #In[1]6.2.2添加键—值对'''字典是一种动态结构,可随时在其中添加键—值对。要添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值。'''alien={'color':'gr......
  • Python千万级字典快速去重脚本
    希望你每天醒来都是阳光的,不会因为别人的几句话,几个表情和几个举止影响自己的心情,好好生活,总会遇见美好的事。。。---- 网易云热评 一、下载地址​​https://github.com/......