字典树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. 《恋上数据结构第1季》二叉搜索树BST

    二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...

  2. 《恋上数据结构第1季》动态数组实现栈

    栈(Stack) 栈的应用 – 浏览器的前进和后退 栈的接口设计 动态数组实现栈 练习题 逆波兰表达式求值 有效的括号 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java ...

  3. 《恋上数据结构第1季》B树

    B树 m阶B树的性质 B树 vs 二叉搜索树 搜索 添加 – 上溢 添加 – 上溢的解决(假设5阶) 删除 删除 – 叶子节点 删除 – 非叶子节点 删除 – 下溢 删除 – 下溢的解决 4阶B树 数 ...

  4. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

  5. 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap

    映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...

  6. 《恋上数据结构第1季》二叉树代码实现

    二叉树(BinaryTree) BinaryTree 基础 遍历(先序.中序.后序.层次遍历) 先序遍历: preorder() 中序遍历: inorder() 后序遍历: postorder() 层 ...

  7. 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)

    二叉树(Binary Tree) 树(Tree)的基本概念 有序树.无序树.森林 二叉树(Binary Tree) 二叉树的性质 真二叉树(Proper Binary Tree) 满二叉树(Full ...

  8. 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题

    二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...

  9. 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet

    集合(Set) 集合的接口定义 双向链表 LinkedList 实现 ListSet 红黑树 RBTree 实现 TreeSet TreeMap 实现 TreeSet HashMap 实现 HashS ...

最新文章

  1. 通过nginx配置文件抵御攻击,防御CC攻击的经典思路!
  2. 修改VIM恶心的注释自动格式化
  3. 数据库ORA-03113排查
  4. js清空本地存储_JS原理、方法与实践 本地存储
  5. OpenResty 反向代理的用法与技巧
  6. 16、java中的集合(3)
  7. pythonfor循环加2_python中for循环如何实现每次控制变量翻倍
  8. 索引超出了数组界限_【每天一题】LeetCode 26. 删除排序数组中的重复项
  9. Spring Boot(13)——使用RestTemplate
  10. Linux之磁盘管理——磁盘分区
  11. OSS SSL 访问异常
  12. win7更改计算机名后桌面壁纸,win7系统电脑壁纸自动改变被恶意篡改的解决方法...
  13. 【渝粤题库】陕西师范大学201841 比较教育学 作业(专升本)
  14. idea使用maven命令
  15. 【SSH网上商城项目实战26】完成订单支付后的短信发送功能
  16. iso镜像添加软件包_ubuntu安装 win7_怎么把自己需要的程序添加到WIN7的原版ISO镜像中? - Win7之家...
  17. 1寸证件照排版、1寸照片、1寸证件照尺寸,不改变图片大小改分辨率,不改变分辨率改变(保证分辨率)...
  18. puppet master/agent
  19. 电阻 电容 电感 磁珠的选型总结对比
  20. java电商项目搭建-------分布式文件存储系统(fastDFS)

热门文章

  1. 没有钱的男人和有钱的男人区别在哪里?
  2. 在公司具备这三个条件,就准备好跳槽吧
  3. 使用 sync.ErrGroup 实现并发搜索文件
  4. sql tempdb清理_SQL Server TempDB数据库和闩锁争用
  5. sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区
  6. 在AWS RDS SQL Server中进行审核
  7. Git安装教程(windows)
  8. 095实战 ETL的数据来源,处理,保存
  9. 使用Google WebP图片格式帮助控制网站页面大小
  10. 如何学习IOS开发~三个字(学思做)