java对字符串快查找_字符串快速查找 - Trie算法
Trie算法
先对给定的字符串进行归集,形成一个多叉树形结构。
使用字符导航方式作匹配查找。
trie算法有很多变种,以最左(前缀)匹配为例进行说明。
优点
使用字符导航查找方式,能最大限度减少字符比较过程,常被用在词频统计和字符串排序方面。
trie算法对文本只需遍历一次,将时间复杂度降到O(n)。
Java示例
数据结构class Node {
Map next;
}
样本数据处理public void add(String text) {
if (text != null) {
char[] ca = text.toCharArray();
Node root = this;
for (char c : ca) {
root = root.put(c);
}
}
}
对样本进行拆解public Node put(char c) {
emptySafe();
Node node = next.get(c);
if (node == null) {
node = new Node();
next.put(c, node);
}
return node;
}
对数据作归集public void emptySafe() {
if (next == null) {
next = new HashMap(5);
}
}
检索算法public boolean exist(String text) {
if (emptyCheck(text)) {
return false;
}
char[] ca = text.toCharArray();
Node root = this;
for (char c : ca) {
if (root.next != null) {
Node node = root.next.get(c);
if (node != null) {
root = node;
}
if (root.next == null) {
return true;
}
}
}
return false;
}
不管是前缀或是包含查找,过程都是顺藤摸瓜。
查找在遇到未匹配的字符时,回到样本数据的根节点,对其它样本做匹配。
举例说明:
有两个样本数据:
/abc、bcd,
被检索字符串:
/ab/bcd
以最左(前缀)匹配查找是不能匹配上的。
在“包含”查找中,查找路径会因为/ab误入歧途,因此,需要在匹配无结果时回到根节点,以便匹配到bcd。
最左(前缀)匹配,较为简单就不再赘述。public boolean prefix(String text) {
if (emptyCheck(text)) {
return false;
}
char[] ca = text.toCharArray();
Node root = this;
for (char c : ca) {
Node node = root.next.get(c);
if (node == null) {
return false;
}
root = node;
if (root.next == null) {
return true;
}
}
return false;
}
public boolean emptyCheck(String text) {
return (next == null || next.isEmpty() || text == null || text.isEmpty());
}
说明
示例中,对样本数据的唯一要求是,不能存在包含关系,如:ab、abc,对这种情况的查找,若最终期望匹配abc是没有问题的,但不能匹配到ab。
java对字符串快查找_字符串快速查找 - Trie算法相关推荐
- java 替换第二个字符_字符串替换第二个相同的字符
r语言如何把字符串中连续的几个相同的字符替换为一比如abbccccdd,替换为abcd保罗?科贺:没有一颗心,会因为追分享梦想而受伤. jquery 把字符串中的某个字符全部替换 start.repl ...
- python给定字符串显示奇数_字符串基础练习题80+道(原文及代码见文尾链接)
Python 字符串基础练习题80+道 1.编写一个Python程序来计算字符串的长度. 2.编写一个Python程序来计算字符串中的字符数(字符频率). Sample String:google.c ...
- java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?
AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...
- java记事本查找_记事本的查找技术
首先你会将记事本的外观都做好.文本区域推荐使用JTextArea.假如这个文本的变量命名为jTextArea.接下来我开始写算法了.建立一个类FindMethod,专门用来计算查找的算法. publi ...
- linuxsed替换字符串后保存_字符串方法——replace()
1.字符串方法-- replace() str.replace(old, new[,max]) 参数说明(Parameters) old:被替换的字符串 new:新字符串,替换原来的old字符串 ma ...
- mysql查询两张表的同一列_如何快速查找两个数据表之间的相同和不同?
原标题:如何快速查找两个数据表之间的相同和不同? 知识 随笔 案例 声音 其他 编者按 工作中经常会遇到对来源不同的数据进行比对,查找相同.不同.差异性等.过于复杂的需求,我们通常会转换思路,使用数据 ...
- 查找窗口隐藏了怎么办_如何快速查找网站管理页面
很多时候,对任何URL进行扫描以查找其漏洞时,渗透测试者或安全研究人员都会尝试查找管理页面(" admin",控制面板或登录名). 登陆任何网站的任何管理页面是任何网站的严重漏洞. ...
- java转安卓快吗_安卓Kotlin开发系列之Java快速转Kotlin
原标题:安卓Kotlin开发系列之Java快速转Kotlin 自从Kotlin被宣布为Android开发语言的官方支持后,如今可谓是火的一塌糊涂,作为一名Android程序员,如何快速爬坑?今天为大家 ...
- spring字符串判空_字符串工具类StringUtils实现字符串是否中文、字符串分割/判空/替换/查找、是否包含乱码及字符串数组合并等常规操作...
一.前言 关于字符串工具类StringUtils实现字符串是否包含isChinese中文.是否包含isMessyCode乱码.常规数据类型转换.替换/删除/判空.两字符串数组mergeStringAr ...
最新文章
- matlab能修图吗,相机上这个“功能”,不打开会影响修图效果,别等拍完照片才知道...
- oracle 存储过程 输入,Oracle 存储过程加密方法
- 不再以讹传讹,GET和POST的真正区别
- Archive object standard check
- jQuery 表单选择器
- 【mybatis系列】自定义实现拦截器插件Interceptor
- mac系统和鸿蒙,鸿蒙发力,或将超越苹果系统
- linux shell 字典 定义 新增元素
- 一个前端写的php博客系统--支持markdown哦
- 解决树莓派aplay找不到声卡的问题
- MeteoInfo 生成等值面
- 未知usb设备(设备描述请求失败)_USB 之传输事务
- 我的程序人生——初识代码,从学好C语言开始
- 【苹果家庭推送】iMessage Number是一种及时静态(Differential Privacy)
- 火线 地线 零线 漫谈
- 尚硅谷-离线数仓-笔记
- (CVPR-2022)AdaViT:用于高效图像识别的自适应视觉变换器
- 手机号批量查询归属地方法及其简介批量查询号码归属地方法
- 异步爬虫(高效爬虫)
- vue-seamless-scroll 使用
热门文章
- Win10中的IIS10安装php manager和IIS URL Rewrite
- 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
- Linux systemd limits
- input只改变光标的颜色 不改变字的颜色
- leetcode 290 Word Pattern
- 【贪心】[USACO 2015 February Contest, Gold]Circular Barn
- 如何使用SwitchyOmega.crx谷歌插件
- 解决:IE中不能自动选择UTF-8编码的解决方法
- Java中的两种异常类型及其区别?
- SpringBoot 接收 单个String入参之解决方案