《恋上数据结构第1季》字典树 Trie
字典树Trie
- Trie 简介
- Trie 实现
- 接口设计
- 源码
- 测试
数据结构与算法笔记目录:《恋上数据结构》 笔记目录
想加深 Java 基础推荐看这个: Java 强化笔记目录
Trie 简介
Trie 也叫做 字典树、前缀树(Prefix Tree)、单词查找树
Trie 搜索字符串的效率主要跟字符串的长度有关
优点:搜索前缀的效率主要跟前缀的长度有关
缺点:需要耗费大量的内存,因此还有待改进
更多Trie 相关的数据结构和算法:
- Double-array Trie、Suffix Tree、Patricia Tree、Crit-bit Tree、AC自动机
例:使用 Trie 存储 cat、dog、doggy、does、cast、add 六个单词
Trie 实现
接口设计
public interface Trie <V> {int size(); boolean isEmpty(); void clear(); boolean contains(String str); V add(String str,V value); V remove(String str); boolean starswith(String prefix);
}
源码
/*** @author yusael* Trie 字典树*/
public class Trie <V> {private int size;private Node<V> root;private static class Node<V>{Node<V> parent;HashMap<Character, Node<V>> children;Character character; // 为删除做准备V value;boolean word; // 是否为单词的结尾(是否为一个完整的单词)public Node(Node<V> parent) {this.parent = parent;}}public int size(){return size;}public boolean isEmpty(){return size == 0;}public void clear(){size = 0;root = null;}public V get(String key){Node<V> node = node(key);return (node!=null && node.word) ? node.value : null;}public boolean contains(String key){Node<V> node = node(key);return node!=null && node.word;}public V add(String key, V value){keyCheck(key);// 创建根节点if(root == null){root = new Node<>(null);}Node<V> node = root;int len = key.length();for(int i = 0; i < len; i++){char c = key.charAt(i);boolean emptyChildren = (node.children==null);Node<V> childNode = emptyChildren ? null : node.children.get(c);if(childNode == null){childNode = new Node<>(node);childNode.character = c;node.children = emptyChildren ? new HashMap<>() : node.children;node.children.put(c, childNode);}node = childNode;}if(node.word){ // 已经存在这个单词V oldValue = node.value;node.value = value;return oldValue;}// 新增一个单词node.word = true;node.value = value;size++;return null;}public V remove(String key){// 找到最后一个节点Node<V> node = node(key);// 如果不是单词结尾,不用作任何处理if(node==null || !node.word) return null;size--;V oldValue = node.value;// 如果还有子节点if(node.children!=null && !node.children.isEmpty()){node.word = false;node.value = null;return oldValue; }// 没有子节点Node<V> parent = null;while((parent = node.parent) != null){parent.children.remove(node.character);if(parent.word || !parent.children.isEmpty()) break;node = parent;}return oldValue;}public boolean startsWith(String prefix){return node(prefix) != null;}/*** 根据传入字符串,找到最后一个节点* 例如输入 dog* 找到 g*/private Node<V> node(String key){keyCheck(key);Node<V> node = root;int len = key.length();for(int i = 0; i < len; i++){if(node==null || node.children==null || node.children.isEmpty()) return null;char c = key.charAt(i);node = node.children.get(c);}return node;}private void keyCheck(String key){if(key==null || key.length()==0){throw new IllegalArgumentException("key must not be empty");}}}
测试
public class Main {public static void main(String[] args) {Trie<Integer> trie = new Trie<>();trie.add("cat", 1);trie.add("dog", 2);trie.add("catalog", 3);trie.add("cast", 4);trie.add("小码哥", 5);System.out.println(trie.size() == 5);System.out.println(trie.startsWith("do"));System.out.println(trie.startsWith("c"));System.out.println(trie.startsWith("ca"));System.out.println(trie.startsWith("cat"));System.out.println(trie.startsWith("cata"));System.out.println(!trie.startsWith("hehe"));System.out.println(trie.get("小码哥") == 5);System.out.println(trie.remove("cat") == 1);System.out.println(trie.remove("catalog") == 3);System.out.println(trie.remove("cast") == 4);System.out.println(trie.size() == 2);System.out.println(trie.startsWith("小"));System.out.println(trie.startsWith("do"));System.out.println(!trie.startsWith("c"));}
}
《恋上数据结构第1季》字典树 Trie相关推荐
- 《恋上数据结构第1季》二叉搜索树BST
二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...
- 《恋上数据结构第1季》动态数组实现栈
栈(Stack) 栈的应用 – 浏览器的前进和后退 栈的接口设计 动态数组实现栈 练习题 逆波兰表达式求值 有效的括号 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java ...
- 《恋上数据结构第1季》B树
B树 m阶B树的性质 B树 vs 二叉搜索树 搜索 添加 – 上溢 添加 – 上溢的解决(假设5阶) 删除 删除 – 叶子节点 删除 – 非叶子节点 删除 – 下溢 删除 – 下溢的解决 4阶B树 数 ...
- 《恋上数据结构第1季》平衡二叉搜索树、AVL树
AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...
- 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap
映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...
- 《恋上数据结构第1季》二叉树代码实现
二叉树(BinaryTree) BinaryTree 基础 遍历(先序.中序.后序.层次遍历) 先序遍历: preorder() 中序遍历: inorder() 后序遍历: postorder() 层 ...
- 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)
二叉树(Binary Tree) 树(Tree)的基本概念 有序树.无序树.森林 二叉树(Binary Tree) 二叉树的性质 真二叉树(Proper Binary Tree) 满二叉树(Full ...
- 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题
二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...
- 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet
集合(Set) 集合的接口定义 双向链表 LinkedList 实现 ListSet 红黑树 RBTree 实现 TreeSet TreeMap 实现 TreeSet HashMap 实现 HashS ...
最新文章
- 通过nginx配置文件抵御攻击,防御CC攻击的经典思路!
- 修改VIM恶心的注释自动格式化
- 数据库ORA-03113排查
- js清空本地存储_JS原理、方法与实践 本地存储
- OpenResty 反向代理的用法与技巧
- 16、java中的集合(3)
- pythonfor循环加2_python中for循环如何实现每次控制变量翻倍
- 索引超出了数组界限_【每天一题】LeetCode 26. 删除排序数组中的重复项
- Spring Boot(13)——使用RestTemplate
- Linux之磁盘管理——磁盘分区
- OSS SSL 访问异常
- win7更改计算机名后桌面壁纸,win7系统电脑壁纸自动改变被恶意篡改的解决方法...
- 【渝粤题库】陕西师范大学201841 比较教育学 作业(专升本)
- idea使用maven命令
- 【SSH网上商城项目实战26】完成订单支付后的短信发送功能
- iso镜像添加软件包_ubuntu安装 win7_怎么把自己需要的程序添加到WIN7的原版ISO镜像中? - Win7之家...
- 1寸证件照排版、1寸照片、1寸证件照尺寸,不改变图片大小改分辨率,不改变分辨率改变(保证分辨率)...
- puppet master/agent
- 电阻 电容 电感 磁珠的选型总结对比
- java电商项目搭建-------分布式文件存储系统(fastDFS)