Trie树学习笔记
来源:互联网 发布:c 代理商系统源码 编辑:程序博客网 时间:2024/06/05 04:15
Trie树:字典树,单词查找树
特点:
- 根节点不包含元素;
- 将根到当前节点路径上的字符连接起来,即为该节点对应的字符串;
- 每个节点的子节点对应的字符串各不相同;
- 对n个字符串构建字典树,时间复杂度为O(n*len),len表示字符串的平均长度;
- 对字典树查找的时间复杂度为O(len),len为待查找字符串的长度;
- 以空间换时间。
应用:
- 在n个字符串中,判断是否存在某个字符串是另一个字符串的前缀;
- 对n个正整数,求出异或值最大的两个数。
import java.util.Scanner;class TrieNode{ TrieNode[] next = new TrieNode[26]; //假设字典树中只存在英文小写字母 boolean flag = false; //标志从根到当前节点的字符连接起来是否构成一个合乎条件的单词}public class Trie { TrieNode root = new TrieNode(); //字典树根节点(哨兵) public boolean searchTrie(String str) { //搜索字符串是否出现在字典树中 if (str == null || str.length() == 0 || root == null) return false; int i = 0; TrieNode p = root; while (i < str.length()) { char temp = str.charAt(i); TrieNode t = p.next[temp - 'a']; if (t == null) return false; p = t; i++; } if (p.flag == true) return true; return false; } public void insertTrie(String str) { //将字符串插入字典树 insertTrie2(str, 0, root); } public void insertTrie2(String str, int i, TrieNode root) { if (str == null || str.length() == 0) return; if (i >= str.length()) { root.flag = true; return; } char temp = str.charAt(i); if (root.next[temp - 'a'] != null) { if (i >= str.length()) root.flag = true; return; } TrieNode t = new TrieNode(); root.next[temp - 'a'] = t; insertTrie2(str, i + 1, t); } public static void main(String[] args) { Trie trie = new Trie(); String[] strs = new String[5]; strs[0] = "hello"; strs[1] = "world"; strs[2] = "dengzy"; strs[3] = "jlu"; strs[4] = "nicetomeetyou"; for (int i = 0; i < 5; i++) trie.insertTrie(strs[i]); Scanner in = new Scanner(System.in); while (true) { String str = in.next(); System.out.println(trie.searchTrie(str)); } }}
0 0
- Trie树学习笔记
- C# 学习笔记:Trie树
- |算法讨论|Trie树 学习笔记
- trie树-《算法导论》学习笔记十四
- 学习笔记:创建Trie 树存储英文单词及中文意思
- Trie树与Trie图的学习
- Trie树学习
- Trie 树学习下
- Trie树学习1
- Trie树学习2
- trie树 整理学习
- Trie树学习
- Trie树学习记录
- Trie树的学习
- Python学习笔记:Trie Tree的实现
- 算法学习之Trie树
- Trie树学习--数据结构一发
- Trie(字典树)的学习
- Volley源码完全解析
- Swift 系统学习 26 Swift语言中的继承, 多态和重写
- 比较生命周期,附带横竖屏切换最最简易方法
- 解决ClickableSpan中点击后ListView中item的长按冲突的问题
- 转载CSDN博客
- Trie树学习笔记
- 递增链表的去重复
- ASP.NET ZERO 学习 —— (8) 开发手册之基于令牌的身份认证&其他
- 对vector 中的结构体元素排序
- IntelliJ IDEA使用教程八 热部署插件 JRebel 安装激活及使用
- leecode 解题总结:334. Increasing Triplet Subsequence
- Swift 系统学习 27 闭包的使用
- legend部分用法
- Java内存思维