leetcode 地址:

https://leetcode.com/problems/implement-trie-prefix-tree/description/

难度:中等

描述:略

解题思路:

Trie树 也就是字典查找树,是一种能够实现在一个字符串集中实现快速查找和匹配的多叉树结构,关于Trie树的深入分析我就不展开了,因为我自己也理解的不深刻^_^,这里只给出Trie树的定义,以及常用的应用场景,然后给出一个简单的java实现,当然代码简洁性和性能上有很大的优化空间。

首先,Trie树的定义(或者说是性质):

1. 根节点是一个空节点,不包含字符

2. 每个节点含有一个字符,以及若干个子节点

3. 每个节点的所有子节点所包含的字符都不相同

3. 树的每个节点到根节点的路径上的所有字符组成一个字符串,表示这个字符串在树中可能存在,或者至少Trie树中存在以此字符串为前缀的字符串

4. 每个非根节点还应该包含一个整型数值,表示根节点到这个节点组成的字符串在Trie树中出现的次数

Trie数的常见应用场景:

1. 字符串检索

2. 词频统计

3. 前缀检索

4.前缀词频统计

5. 对所有的字符串按照字典序排序

java实现:

public class Trie {
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("apple");
System.out.println(trie.search("apple"));
System.out.println(trie.search("app")); // returns false
System.out.println(trie.startsWith("app")); // returns true
trie.insert("app");
System.out.println(trie.search("app")); // returns true
} TrieNode root; /**
* Initialize your data structure here.
*/
public Trie() {
root = new TrieNode();
} /**
* Inserts a word into the trie.
*/
public void insert(String word) {
insert(word, root, 0);
} /**
* 将从index处开始的字串插入到root的子节点中,即将index对应的字符插入到root的子节点中
* @param word
* @param root
* @param index
*/
private void insert(String word, TrieNode root, int index) {
assert index < word.length() && index > -1;
char cur = word.charAt(index);
TreeMap<Character, TrieNode> children = root.children;
if (null == children) {
children = new TreeMap<>();
root.children = children;
}
if (!children.containsKey(cur)) {
children.put(cur, new TrieNode(cur));
}
if (index == word.length() - 1) {
children.get(cur).occurency++;
return;
}
insert(word, children.get(cur), index + 1);
} /**
* Returns if the word is in the trie.
*/
public boolean search(String word) {
return search(word, root, 0);
} /**
* 在root的子节点中搜索从index开始的字串
* @param word
* @param root
* @param index
* @return
*/
private boolean search(String word, TrieNode root, int index) {
assert index > -1 && index < word.length();
char cur = word.charAt(index);
if (root.children == null ||
!root.children.containsKey(cur)) {
return false;
}
if (index == word.length() - 1) {
return root.children.get(cur).occurency > 0;
}
return search(word, root.children.get(cur), index + 1);
} /**
* Returns if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String prefix) {
return startsWith(prefix, root, 0);
} /**
* 在root的子节点中搜索从index开始字串对应的前缀
* @param prefix
* @param root
* @param index
* @return
*/
private boolean startsWith(String prefix, TrieNode root, int index) {
assert index > -1 && index < prefix.length();
char cur = prefix.charAt(index);
if (root.children == null ||
!root.children.containsKey(cur)) {
return false;
}
if (index == prefix.length() - 1) {
return true;
}
return startsWith(prefix, root.children.get(cur), index + 1);
} static class TrieNode {
char c;
int occurency = 0;
TreeMap<Character, TrieNode> children; public TrieNode() {
} public TrieNode(char c) {
this.c = c;
}
}
}

Trie树的java实现的更多相关文章

  1. Trie 树 及Java实现

    来源于英文“retrieval”.   Trie树就是字符树,其核心思想就是空间换时间. 举个简单的例子.   给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现 ...

  2. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

  3. leetcode网站中找到的关于trie树的JAVA版本介绍

    class TrieNode { // R links to node children private TrieNode[] links; private final int R = 26; pri ...

  4. Trie树的应用:查询IP地址的ISP

    1. 问题描述 给定一个IP地址,如何查询其所属的ISP,如:中国移动(ChinaMobile),中国电信(ChinaTelecom),中国铁通(ChinaTietong)?现有ISP的IP地址区段可 ...

  5. 从Trie树到双数组Trie树

    Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查 ...

  6. Trie树(转:http://blog.csdn.net/arhaiyun/article/details/11913501)

    Trie 树, 又称字典树,单词查找树.它来源于retrieval(检索)中取中间四个字符构成(读音同try).用于存储大量的字符串以便支持快速模式匹配.主要应用在信息检索领域. Trie 有三种结构 ...

  7. 字典树(Trie)的java实现

    一.定义 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用 ...

  8. java实现的Trie树数据结构

    近期在学习的时候,常常看到使用Trie树数据结构来解决这个问题.比方" 有一个1G大小的一个文件.里面每一行是一个词.词的大小不超过16字节,内存大小限制是1M. 返回频数最高的100个词. ...

  9. Trie树(字典树)的介绍及Java实现

    简介 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也 ...

随机推荐

  1. iOS开发xib控件删不掉,修改xib运行不发生改变,修改xib不管用

    修改xib控件tag值,颜色,大小,甚至删除发现编译.运行之后效果没改变,用代码修改内容发现管用, 其实只需要clean一下!^_^ 快捷键:shift + command + k

  2. 前端(1)HTML介绍

    1.1 HTML介绍 1.1Web服务本质 服务端 import socket server = socket.socket() server.bind(("127.0.0.1", ...

  3. vs2008 新建win32控制台程序提示:脚本错误

    解决方案: 1.根据错误信息中的url,找到对应文件夹下的htm文件 2.使用notepad++打开default.htm文件,找到错误提示的434行,注释掉433和434行 然后保存文件,重新新建w ...

  4. python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射

    多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...

  5. [NOI2010]超级钢琴 主席树

    [NOI2010]超级钢琴 链接 luogu 思路 和12省联考的异或粽子一样. 堆维护n个左端点,每次取出来再放回去次 代码 #include <bits/stdc++.h> #defi ...

  6. 【斜率优化】【P5468】 [NOI2019]回家路线

    Description 给定 \(n\) 点,这 \(n\) 个点由 \(m\) 班列车穿插连结.对于第 \(i\) 班列车,会在 \(p_i\) 时刻从 \(x_i\) 站点出发开向 \(y_i\) ...

  7. 并发设计模式:Immutability模式

    多个线程同时读写同一共享变量存在并发问题,其中的必要条件之一就是 读写 ,如果没有写,只存在读,是不会存在并发问题的. 如果让一个共享变量只有读操作,没有写操作,如此则可以解决并发问题.该理论的具体实 ...

  8. Set和Multiset 怎么用咧↓↓↓

    转自:[C++ STL]Set和Multiset - Memset - 博客园https://www.cnblogs.com/ChinaHook/p/6985444.html (对字体进行了略微的修改 ...

  9. cad.net cad宋体问号 删除 KT_ST.ttf

    我的两台电脑是win10的,(可能这个问题也存在在xp.win7.win8.......毕竟十年前我就遇到过了.......) 一台电脑的cad字体设置为"宋体",另一台电脑打开之 ...

  10. JMeter工具学习(二)——获取登录 token

    备注: JMeter版本4.0 JDK版本1.8 1,新增线程组 2,添加http请求(如何添加Http请求查看详情) 3,添加正则表达式提取器(regular expression extracto ...