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)相关推荐

  1. Java实现字典树 Trie

    Java实现字典树 Trie 一.字典树介绍 二.Trie实现以及基本的插入查询操作 数组实现: HashMap实现: Trie插入(这里都以数组实现为例): Trie查询: 三.相关例题: 1.le ...

  2. java trie_java字典树(Trie)实现中文模糊匹配

    package com.xq.algorithm; import java.io.BufferedReader; import java.io.IOException; import java.uti ...

  3. java工具:字典树(单词查找树/Trie树)的实现以及使用

    项目地址 https://github.com/kylin-hunter/k-dic 文章目录 项目地址 前言 一.字典树 二.使用步骤 1 引入库 1.1 编译并发布到本地 1.2 gradle ( ...

  4. 《恋上数据结构第1季》字典树 Trie

    字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...

  5. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

  6. php 字典树,关于php:数据结构PHP-字典树Trie的实现

    ​这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形构造,是一种哈希树的变种.典型利用是用于统计,排序和保留大量的字符串(但不仅限于字符串),所以常常被搜索引擎零碎用于文本词频统 ...

  7. php trie,数据结构-PHP 字典树(Trie)的实现

    ​这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统 ...

  8. 11、java常用单词(转载)

    abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...

  9. php打印文件目录结构,php和java关于目录树(列出某一目录下文件结构)

    php和java关于目录树(列出某一目录下文件结构) java的写法 /** * * @param location * @param nameList保存结果的! */ public void li ...

最新文章

  1. java float转换int
  2. android:SQlite
  3. Python 命令汇总
  4. java在控制台打印余弦曲线,java打印正弦曲线示例
  5. SpringBoot查看和修改依赖的版本
  6. python数据框添加一列无列名_Pandas只使用列名创建空数据框
  7. 2.微信小程序(colorUI)- 构建底部操作条
  8. 【源码】垂直偶极子天线的矩量法
  9. java mp3剪切_mp3剪切器如何剪切mp3音频文件
  10. 酷客scrm发布:陌生人扫码进群原来是这么回事
  11. Vue $attrs使用方式及使用场景
  12. 一文轻松明白 Base64 编码原理
  13. 网页视频倍速播放教程
  14. 在线版区间众数 hzw的代码。。
  15. 位(Bit)与字节(Byte)
  16. 【金猿案例展】某国际知名美妆集团——数据赋能精准营销
  17. 使用Bmob遇到的坑与解决办法
  18. c语言:九九乘法表 | 正三角形 | 倒三角形
  19. AndroidGradle基础——渠道化配置
  20. 20190724杭电多校第二场

热门文章

  1. python 京东_Python数据分析-京东订单数据分析实战
  2. java array 元素的位置_JAVA集合类,有这一篇就够了
  3. c语言逃跑的蠕虫函数,源码指标:穿越5线 第一时间吃鱼身 上行末端逃跑 没有未来函数 通达信幅图 精品公式...
  4. PHP简洁美观轻量级秀恩爱网站源码
  5. 响应式织梦通用企业网站后台模板(自适应手机端)
  6. DBX到PDF转换器
  7. 雷鸟下载器v3.0.0 百度网盘第三方不限速下载工具
  8. linux 网络瘫痪,Linux内核发现TCP漏洞,小流量也能DoS瘫痪设备
  9. 上海交大计算机网络课程作业,上海交大计算机网络第四次作业详解.doc
  10. disabled运用;div,li元素禁用点击事件;防止a标签打开url;禁用click事件,删除onclick