Java Trie字典树,前缀树
Trie查询每个条目的时间复杂度,和字典中一共有多少条无关。
时间复杂度为O(W)
w为查询单词的长度
- import java.util.TreeMap;
- public class Trie {
- private class Node {
- public boolean isWord;
- public TreeMap<Character, Node> next;
- public Node(boolean isWord) {
- this.isWord = isWord;
- next = new TreeMap<>();
- }
- public Node() {
- this(false);
- }
- }
- private Node root;
- private int size;
- public Trie() {
- root = new Node();
- size = 0;
- }
- // 返回Trie中存储的单词数量
- public int getSize() {
- return size;
- }
- // 向Trie中添加一个新的单词word
- public void add(String word) {
- Node cur = root;
- for (int i = 0; i < word.length(); i++) {
- char c = word.charAt(i);
- if (cur.next.get(c) == null)
- cur.next.put(c, new Node());
- cur = cur.next.get(c);
- }
- if (!cur.isWord) {
- cur.isWord = true;
- size++;
- }
- }
- //查询单词word是否在Trie中
- public boolean contains(String word){
- Node cur=root;
- for (int i = 0; i < word.length(); i++) {
- char c=word.charAt(i);
- if(cur.next.get(c)==null)
- return false;
- cur=cur.next.get(c);
- }
- return cur.isWord;
- }
- //查询是否在Trie中有单词以prefix为前缀
- public boolean isPrefix(String prefix) {
- Node cur=root;
- for (int i = 0; i < prefix.length(); i++) {
- char c=prefix.charAt(i);
- if(cur.next.get(c)==null)
- return false;
- cur=cur.next.get(c);
- }
- return true;
- }
- }
测试:
- public class Main {
- public static void Main(String[] args){
- System.out.println("Pride and Prejudice");
- ArrayList<String> words=new ArrayList<>();
- if(FileOperation.readFile("pride-and-prejudice.txt", words)){
- long startTime = System.nanoTime();
- BSTSet<String> set=new BSTSet<String>();
- for(String word:words)
- set.add(word);
- for(String word:words)
- set.contains(word);
- long endTime = System.nanoTime();
- double time = (endTime - startTime) / 1000000000.0;
- System.out.println("Total different words: " + set.getSize());
- System.out.println("BSTSet: " + time + " s");
- startTime = System.nanoTime();
- Trie trie = new Trie();
- for(String word: words)
- trie.add(word);
- for(String word: words)
- trie.contains(word);
- endTime = System.nanoTime();
- time = (endTime - startTime) / 1000000000.0;
- System.out.println("Total different words: " + trie.getSize());
- System.out.println("Trie: " + time + " s");
- }
- }
- }
search可以搜索文字或正则表达式字符串,字符串只包含字母.或者a-z.
- import java.util.TreeMap;
- public class WordDictionary {
- public class Node{
- private boolean isWord;
- public TreeMap<Character, Node> next;
- public Node(boolean isWord){
- this.isWord=isWord;
- next=new TreeMap<>();
- }
- public Node() {
- this(false);
- }
- }
- private Node root;
- public WordDictionary(){
- root =new Node();
- }
- public void addWord(String word) {
- Node cur = root;
- for (int i = 0; i < word.length(); i++) {
- char c = word.charAt(i);
- if (cur.next.get(c) == null)
- cur.next.put(c, new Node());
- cur = cur.next.get(c);
- }
- cur.isWord = true;
- }
- public boolean search(String word){
- return match(root, word, 0);
- }
- private boolean match(Node node,String word,int index) {
- if(index==word.length())
- return node.isWord;
- char c=word.charAt(index);
- if(c!='.'){
- if(node.next.get(c)==null)
- return false;
- return match(node.next.get(c), word, index+1);
- }else{
- for (char nextChar :node.next.keySet()) {
- if(match(node.next.get(nextChar), word, index+1))
- return true;
- }
- return false;
- }
- }
- }
Trie和映射
- import java.util.TreeMap;
- public class MapSum {
- private class Node{
- public boolean isWord;
- public int value;
- public TreeMap<Character, Node> next;
- public Node(int value){
- this.value=value;
- next=new TreeMap<>();
- }
- public Node(){this(0);}
- }
- private Node root;
- public MapSum() {
- root=new Node();
- }
- public void insert(String word,int val){
- Node cur=root;
- for (int i = 0; i < word.length(); i++) {
- char c=word.charAt(i);
- if(cur.next.get(c)==null)
- cur.next.put(c,new Node());
- cur=cur.next.get(c);
- }
- cur.value=val;
- }
- public int sum(String prefix){
- Node cur=root;
- for (int i = 0; i < prefix.length(); i++) {
- char c=prefix.charAt(i);
- if(cur.next.get(c)==null)
- return 0;
- cur=cur.next.get(c);
- }
- return sum(cur);
- }
- private int sum(Node node){
- if(node.next.size()==0)
- return node.value;
- int res=node.value;
- for (char c:node.next.keySet())
- res+=sum(node.next.get(c));
- return res;
- }
- }
Java Trie字典树,前缀树的更多相关文章
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); trie. ...
- 内存空间有限情况下的词频统计 Trie树 前缀树
数据结构与算法专题--第十二题 Trie树 https://mp.weixin.qq.com/s/nndr2AcECuUatXrxd3MgCg
- Trie - leetcode [字典树/前缀树]
208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...
- LeetCode OJ:Implement Trie (Prefix Tree)(实现一个字典树(前缀树))
Implement a trie with insert, search, and startsWith methods. 实现字典树,前面好像有道题做过类似的东西,代码如下: class TrieN ...
- HDU 1251 字典树(前缀树)
题目大意 :Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).(单词互不相同) ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- TRIE 字典树 前缀紧急集合!
TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...
随机推荐
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- 【CF1152F】Neko Rules the Catniverse(动态规划)
[CF1152F]Neko Rules the Catniverse(动态规划) 题面 CF 题解 我们先考虑一个需要扫一遍所有位置的做法. 那么状态一定是\(f[i]\)然后什么什么表示考虑到当前第 ...
- cinder-volume报错vmdk2 is reporting problems, not sending heartbeat. Service will appear "down".
cinder-volume报错vmdk2 is reporting problems, not sending heartbeat. Service will appear "down&qu ...
- [HNOI/AHOI2018]毒瘤
题目描述 https://www.lydsy.com/JudgeOnline/upload/201804/%E6%B9%96%E5%8D%97%E4%B8%80%E8%AF%95%E8%AF%95%E ...
- 【优秀的图片后期编辑工具】Luminar 3.1 for Mac
[简介] 今天和大家分享最新的 Luminar for Mac 3.1 版本,支持中文界面,Luminar是一款Mac上优秀的图片后期处理工具,功能类似 Photoshop Lightroom 等软 ...
- font-family
Font-family: Helvetica, Tahoma, Arial, “Microsoft YaHei”, “微软雅黑”, SimSun, “宋体”, STXihei, “华文细黑”, Hei ...
- H5_0002:微信分享设置
1,非公众号的链接,设置分享的预览图片. 先打开页面,在收藏页面,最后在收藏界面长按 “转发” ,即可在链接上出现预览图片.
- table自适应大小,以及内容换行
在table的样式中加入以下两个样式: table-layout: fixed; word-wrap:break-word;
- addEventListener解决多个window.onscroll共存的2个方法
方法1.(注意第一个和第二个的先后次序) window.onscroll=function(){console.log('第一个');} var oldMethod = window.onscroll ...
- git体验
(1)git初始化配置#配置用户名git config --global user.name "azcode"#配置邮箱git config --global user.email ...