字典树trie学习
字典树trie的思想就是利用节点来记录单词,这样重复的单词可以很快速统计,单词也可以快速的索引。缺点是内存消耗大
http://blog.csdn.net/chenleixing/article/details/44708533 这个是学习资料来源。
附上个人代码实践操作
package ShuJujieGou;
import javax.swing.tree.TreeNode;
public class Tries {
private int deepLength;
private int nodeNumber;
private final int SIZE = 26;
private treeNode root;
public Tries() {
deepLength = 0;
nodeNumber = 0;
root = new treeNode();
}
private class treeNode {
public int passNumeber;// 从这里进过的节点单词数量
private int endNumber;// 相同单词有几个
private boolean isEnd;// 是否结束
private treeNode[] son;
private char word;
public treeNode() {
this.passNumeber = 0;
this.endNumber = 0;
this.isEnd = false;
son = new treeNode[SIZE];
}
}
private boolean isWord(String str) {
if (str == null || !str.matches("[0-9a-zA-Z]*")) {
return false;
}
return true;
}
public void insertWord(String str) {
if (!isWord(str)) {
System.out.println("请输入正确字符");
return;
}
treeNode node = this.root;
String s = str.toLowerCase();
char[] word = s.toCharArray();
for (char c : word) {
int cn = c - 'a';
if (node.son[cn] == null) {
node.son[cn] = new treeNode();
node=node.son[cn];
node.word = c;
this.nodeNumber++;
node.passNumeber=1;
} else {
node = node.son[cn];
node.passNumeber++;
}
}
node.isEnd = true;
node.endNumber++;
if (this.deepLength < word.length) {
this.deepLength = word.length;
}
}
public void sayMyself() {
System.out.println("length:" + this.deepLength);
System.out.println("nodenumber:" + this.nodeNumber);
}
public void getWord(treeNode node,String str){
for (int x=0;x<SIZE;x++){
if(!(node.son[x]==null)){
String s= str+node.son[x].word;
getWord(node.son[x],s);
if(node.son[x].isEnd){
System.out.println("单词:"+s);
}
}
}
}
public void getAllWord(){//这里添加上面文章没有的把所有单词全部索引出来
String s = "";
getWord(root,s);
}
}
//测试代码
package ShuJujieGou;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tries tree = new Tries();
tree.insertWord("car");
tree.insertWord("bus");
tree.insertWord("chicken");
tree.insertWord("cook");
tree.insertWord("rock");
tree.insertWord("hard");
tree.insertWord("good");
tree.insertWord("bad");
tree.sayMyself();
tree.getAllWord();
}
}
/*
输出
length:7
nodenumber:29
单词:bad
单词:bus
单词:car
单词:chicken
单词:cook
单词:good
单词:hard
单词:rock
*/
字典树trie学习的更多相关文章
- 字典树(Trie)学习笔记
目录 什么是字典树 如何存储字典树 如何查找字符串有没有出现 第一个图的那种线段树 应用 例题 1.统计难题 2.P2580 于是他错误的点名开始了 什么是字典树 上图来自luogu题解 这是一种字典 ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- 『字典树 trie』
字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...
- 字典树(Trie)详解
详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...
- Trie字典树的学习及理解
字典树详解见此 我这里学习时主要是看了李煜东的进阶指南里的讲解,以下是书中介绍的内容. Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构,Tire的每个节点都拥有若干个字符指针,若在插入 ...
- 字典树 trie树 学习
一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种 二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
- 字典树(Trie)的学习笔记
按照一本通往下学,学到吐血了... 例题1 字典树模板题吗. 先讲讲字典树: 给出代码(太简单了...)! #include<cstdio> #include<cstring> ...
- LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串
所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...
随机推荐
- DAG最长路问题 hdu-1224
用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostre ...
- json -- dump load dumps loads 简单对比
json.dumps是将一个Python数据类型列表进行json格式的编码解析, 示例如下: >>> import json #导入python 中的json模块>>&g ...
- Single Number leetcode java
问题描述: Given an array of integers, every element appears twice except for one. Find that single one. ...
- Jupyter notebook 转 pdf [完整转换]
- 谈一谈HashMap类2
1.由一个小案例引出本博文的讨论 public class Demo1 { public static void main(String[] args) throws Exception { Stud ...
- 3月19 HTML静态网页的制作
HTML :内容(Hyper Text Markup Language,超文本标记语言) <html>---开始标签 <head> 网页上的控制信息 <title> ...
- React文档(七)处理事件
React元素处理事件和DOM元素处理事件很类似.下面是一些语法的不同之处: React事件的命名是用驼峰命名,而不是小写字母. 利用JSX你传递一个函数作为事件处理器,而不是一个字符串. 举个例子, ...
- Beta阶段——第5篇 Scrum 冲刺博客
Beta阶段--第5篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了邮箱发送功能的测试,测 ...
- JS实现下拉单的二级联动
因工作需要,做了一个下拉单的二级联动. 第一级是固定的选项,有A.B两个选项,第二级的选项随着第一级选项的变化而变化. 一开始是这样的: HTML代码 <html> <head> ...
- Git:合并分支冲突问题
首先创建分支feature1,并且修改readme.txt内容,再在该分支上提交. 切换回master分支, 并且修改readme.txt内容,再在master分支上提交. 此时的分支路线如下,合并时 ...