Java实现单词树(trie)
package com.shundong.utils;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/** * 一个只能处理26个字母的单词树(trie)* 空间换时间 T(n) = O(n) * ps:如果缺陷 欢迎留言* @author shundong* @data 2018-10-13*/public class FindWordsTrie{//一个Trie树有一个根节点private Vertex root;//内部类or节点类protected class Vertex{protected int words;protected int prefixes;//每个节点包含26个子节点(类型为自身)protected Vertex[] edges;Vertex() {words = 0;prefixes = 0;edges = new Vertex[26];for (int i = 0; i < edges.length; i++) {edges[i] = null;}}}public FindWordsTrie () {root = new Vertex();}/** * 列出List所有单词* @return*/public List< String> listAllWords() {List< String> words = new ArrayList< String>();Vertex[] edges = root.edges;for (int i = 0; i < edges.length; i++) {if (edges[i] != null) {String word = "" + (char)('a' + i);depthFirstSearchWords(words, edges[i], word);}} return words;}/** * Depth First在Trie中搜索单词并将它们添加到List中。* @param words* @param vertex* @param wordSegment*/private void depthFirstSearchWords(List words, Vertex vertex, String wordSegment) {Vertex[] edges = vertex.edges;boolean hasChildren = false;for (int i = 0; i < edges.length; i++) {if (edges[i] != null) {hasChildren = true;String newWord = wordSegment + (char)('a' + i); depthFirstSearchWords(words, edges[i], newWord);} }if (!hasChildren) {words.add(wordSegment);}}public int countPrefixes(String prefix) {return countPrefixes(root, prefix);}private int countPrefixes(Vertex vertex, String prefixSegment) {if (prefixSegment.length() == 0) { //到达单词的最后一个字符return vertex.prefixes;}char c = prefixSegment.charAt(0);int index = c - 'a';if (vertex.edges[index] == null) { // 这个词不存在return 0;} else {return countPrefixes(vertex.edges[index], prefixSegment.substring(1));} }public int countWords(String word) {return countWords(root, word);} private int countWords(Vertex vertex, String wordSegment) {if (wordSegment.length() == 0) { //到达单词的最后一个字符return vertex.words;}char c = wordSegment.charAt(0);int index = c - 'a';if (vertex.edges[index] == null) { // 这个词不存在return 0;} else {return countWords(vertex.edges[index], wordSegment.substring(1));} }/** * 在Trie上添加一个单词* @param word 要添加的词*/public void addWord(String word) {addWord(root, word);}/** * 添加指定顶点的单词* @param vertex 指定的顶点* @param word 要添加的词*/private void addWord(Vertex vertex, String word) {if (word.length() == 0) { //如果已添加该单词的所有字符vertex.words ++;} else {vertex.prefixes ++;char c = word.charAt(0);c = Character.toLowerCase(c);int index = c - 'a';if (vertex.edges[index] == null) { //如果边缘不存在vertex.edges[index] = new Vertex();}addWord(vertex.edges[index], word.substring(1)); //去下一个}}//简单的测试测试public static void main(String args[]) {FindWordsTrie trie = new FindWordsTrie();trie.addWord("cabbage");trie.addWord("cabbage");trie.addWord("cabbage");trie.addWord("cabbage");trie.addWord("cabin");trie.addWord("berte");trie.addWord("cabbage");trie.addWord("english");trie.addWord("establish");trie.addWord("good");// System.out.println(trie.root.prefixes);// System.out.println(trie.root.words);// List< String> list = trie.listAllWords();// Iterator listiterator = list.listIterator();// //遍历// while(listiterator.hasNext())// {// String str = (String)listiterator.next();// System.out.println(str);// }int count = trie.countPrefixes("c");//此处传参int count1=trie.countWords("cabbage");System.err.println("单词c 前缀个数为:"+count);System.err.println("cabbage 单词的个数为:"+count1);}
}
转载于:https://www.cnblogs.com/shundong106/p/9791635.html
Java实现单词树(trie)相关推荐
- Java实现字典树 Trie
Java实现字典树 Trie 一.字典树介绍 二.Trie实现以及基本的插入查询操作 数组实现: HashMap实现: Trie插入(这里都以数组实现为例): Trie查询: 三.相关例题: 1.le ...
- java trie_java字典树(Trie)实现中文模糊匹配
package com.xq.algorithm; import java.io.BufferedReader; import java.io.IOException; import java.uti ...
- java工具:字典树(单词查找树/Trie树)的实现以及使用
项目地址 https://github.com/kylin-hunter/k-dic 文章目录 项目地址 前言 一.字典树 二.使用步骤 1 引入库 1.1 编译并发布到本地 1.2 gradle ( ...
- 《恋上数据结构第1季》字典树 Trie
字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...
- HDU 1247 Hat’s Words 字典树(Trie树)
HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...
- php 字典树,关于php:数据结构PHP-字典树Trie的实现
这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形构造,是一种哈希树的变种.典型利用是用于统计,排序和保留大量的字符串(但不仅限于字符串),所以常常被搜索引擎零碎用于文本词频统 ...
- php trie,数据结构-PHP 字典树(Trie)的实现
这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统 ...
- 11、java常用单词(转载)
abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...
- php打印文件目录结构,php和java关于目录树(列出某一目录下文件结构)
php和java关于目录树(列出某一目录下文件结构) java的写法 /** * * @param location * @param nameList保存结果的! */ public void li ...
最新文章
- java float转换int
- android:SQlite
- Python 命令汇总
- java在控制台打印余弦曲线,java打印正弦曲线示例
- SpringBoot查看和修改依赖的版本
- python数据框添加一列无列名_Pandas只使用列名创建空数据框
- 2.微信小程序(colorUI)- 构建底部操作条
- 【源码】垂直偶极子天线的矩量法
- java mp3剪切_mp3剪切器如何剪切mp3音频文件
- 酷客scrm发布:陌生人扫码进群原来是这么回事
- Vue $attrs使用方式及使用场景
- 一文轻松明白 Base64 编码原理
- 网页视频倍速播放教程
- 在线版区间众数 hzw的代码。。
- 位(Bit)与字节(Byte)
- 【金猿案例展】某国际知名美妆集团——数据赋能精准营销
- 使用Bmob遇到的坑与解决办法
- c语言:九九乘法表 | 正三角形 | 倒三角形
- AndroidGradle基础——渠道化配置
- 20190724杭电多校第二场
热门文章
- python 京东_Python数据分析-京东订单数据分析实战
- java array 元素的位置_JAVA集合类,有这一篇就够了
- c语言逃跑的蠕虫函数,源码指标:穿越5线 第一时间吃鱼身 上行末端逃跑 没有未来函数 通达信幅图 精品公式...
- PHP简洁美观轻量级秀恩爱网站源码
- 响应式织梦通用企业网站后台模板(自适应手机端)
- DBX到PDF转换器
- 雷鸟下载器v3.0.0 百度网盘第三方不限速下载工具
- linux 网络瘫痪,Linux内核发现TCP漏洞,小流量也能DoS瘫痪设备
- 上海交大计算机网络课程作业,上海交大计算机网络第四次作业详解.doc
- disabled运用;div,li元素禁用点击事件;防止a标签打开url;禁用click事件,删除onclick