当前位置: 首页 > news >正文

高性能AC算法多关键词匹配文本功能Java实现

直接上测试结果:

1000000数据集。
1000000关键词(匹配词)

装载消耗时间:20869 毫秒
匹配消耗时间:6599 毫秒

代码和测试案例:

package com.baian.tggroupmessagematchkeyword.ac;import lombok.Data;import java.util.*;/*** @program: tg-parent* @description: ac* @author: <发哥讲Java-694204477@qq.com>* @create: 2023-09-19 17:20**/
@Data
public class AhoCorasick {private TrieNode root;public AhoCorasick() {root = new TrieNode();}public void addKeyword(String keyword) {TrieNode current = root;for (char ch : keyword.toCharArray()) {current = current.getChildren().computeIfAbsent(ch, c -> new TrieNode());}current.setEndOfWord(true);current.addKeyword(keyword);}public void buildFailureLinks() {Queue<TrieNode> queue = new LinkedList<>();root.setFailure(null);queue.offer(root);while (!queue.isEmpty()) {TrieNode current = queue.poll();for (TrieNode child : current.getChildren().values()) {TrieNode failure = current.getFailure();while (failure != null && !failure.getChildren().containsKey(child.getKey())) {failure = failure.getFailure();}if (failure == null) {child.setFailure(root);} else {child.setFailure(failure.getChildren().get(child.getKey()));child.addAllKeywords(child.getFailure().getKeywords());}queue.offer(child);}}}public List<String> searchKeywords(String text) {List<String> result = new ArrayList<>();TrieNode current = root;for (int i = 0; i < text.length(); i++) {char ch = text.charAt(i);while (current != null && !current.getChildren().containsKey(ch)) {current = current.getFailure();}if (current == null) {current = root;} else {current = current.getChildren().get(ch);if (current.isEndOfWord()) {result.addAll(current.getKeywords());}TrieNode failure = current.getFailure();while (failure != null) {if (failure.isEndOfWord()) {result.addAll(failure.getKeywords());}failure = failure.getFailure();}}}return result;}public static class TrieNode {private char key;private boolean endOfWord;private TrieNode failure;private Map<Character, TrieNode> children;private List<String> keywords;public TrieNode() {children = new HashMap<>();keywords = new ArrayList<>();}public char getKey() {return key;}public void setKey(char key) {this.key = key;}public boolean isEndOfWord() {return endOfWord;}public void setEndOfWord(boolean endOfWord) {this.endOfWord = endOfWord;}public TrieNode getFailure() {return failure;}public void setFailure(TrieNode failure) {this.failure = failure;}public Map<Character, TrieNode> getChildren() {return children;}public List<String> getKeywords() {return keywords;}public void addKeyword(String keyword) {keywords.add(keyword);}public void addAllKeywords(List<String> keywords) {this.keywords.addAll(keywords);}}
}

main:

package test;import com.baian.tggroupmessagematchkeyword.ac.AhoCorasick;import java.util.ArrayList;
import java.util.List;
import java.util.UUID;/*** @program: tg-parent* @description: 多样本数据集 测试。* @author: <发哥讲Java-694204477@qq.com>* @create: 2023-09-19 14:11**/
public class TestMain001 {public static void main(String[] args) {long start0 = System.currentTimeMillis();List<String> datas = new ArrayList<>(1000000);for (int i = 0; i < 1000000; i++) {datas.add(UUID.randomUUID().toString() + UUID.randomUUID().toString());}AhoCorasick ahoCorasick2 = new AhoCorasick();for (int i = 0; i < 1000000; i++) {ahoCorasick2.addKeyword(UUID.randomUUID().toString());}ahoCorasick2.addKeyword("11");ahoCorasick2.addKeyword("22");ahoCorasick2.buildFailureLinks();long end0 = System.currentTimeMillis();System.out.println("装载消耗时间:" + (end0 - start0));long start = System.currentTimeMillis();for (String message : datas) {List<String> stringList = ahoCorasick2.searchKeywords(message);if (stringList.size() > 0) {
//                System.out.println(stringList + " message:" + message + " size:" + stringList.size());}}long end = System.currentTimeMillis();System.out.println("消耗时间:" + (end - start));}
}

相关文章:

高性能AC算法多关键词匹配文本功能Java实现

直接上测试结果&#xff1a; 1000000数据集。 1000000关键词&#xff08;匹配词&#xff09; 装载消耗时间&#xff1a;20869 毫秒 匹配消耗时间&#xff1a;6599 毫秒 代码和测试案例&#xff1a; package com.baian.tggroupmessagematchkeyword.ac;import lombok.Data;im…...

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好&#xff0c;我是沙漠尽头的狼。 本方首发于Dotnet9&#xff0c;介绍使用dnSpy调试第三方.NET库源码&#xff0c;行文目录&#xff1a; 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具&#xff0c;…...

仿互站资源商城平台系统源码多款应用模版

首先安装好环境&#xff0c;推荐用Linux宝塔 请示&#xff1a;安装前请先别开防火墙&#xff0c;和跨站篡改 第1步上传程序到服务器&#xff0c; 第2步修改数据库文件&#xff0c;config/config.php 第3步&#xff0c;导入数据&#xff0c;根目录的数据库文件夹里面 数据.s…...

华为云云耀云服务器L实例评测 | L实例性能测试实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…...

VR赋能红色教育,让爱国主义精神永放光彩

昨天的918防空警报长鸣&#xff0c;人们默哀&#xff0c;可见爱国主义精神长存。为了贯彻落实“把红色资源利用好、红色传统发扬好、红色基因传承好”的指示精神&#xff0c;许多红色景点开始引入VR全景展示技术&#xff0c;为游客提供全方位720度无死角的景区展示体验。 VR全…...

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]

目录标题 参考学习链接图像噪声噪声分类椒盐噪声脉冲噪声对椒盐噪声&脉冲噪声去噪使用高斯卷积核中值滤波器 高斯噪声减少高斯噪声 参考学习链接 计算机视觉与深度学习-04-图像去噪&卷积-北邮鲁鹏老师课程笔记 图像噪声 噪声点&#xff0c;其实在视觉上看上去让人感…...

三行代码实现图像画质修复,图片清晰度修复,清晰度提升python

核心代码 # 原始文件 enhancer ImageEnhance.Sharpness(Image.open(文件路径.png)) # 增强图片 img_enhanced enhancer.enhance(增强系数float) # 输出目标文件 img_enhanced.save(文件名.png)注意&#xff0c;输入输出文件格式必须一致 所需依赖 # 文件选择框&#xff0c…...

企业电子招投标采购系统源码之电子招投标的组成

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

【MySQL】 MySQL的增删改查(进阶)--贰

文章目录 &#x1f6eb;新增&#x1f6ec;查询&#x1f334;聚合查询&#x1f6a9;聚合函数&#x1f388;GROUP BY子句&#x1f4cc;HAVING &#x1f38b;联合查询⚾内连接⚽外连接&#x1f9ed;自连接&#x1f3c0;子查询&#x1f3a1;合并查询 &#x1f3a8;MySQL的增删改查(…...

第七章 查找

一、树形查找-二叉排序树和红黑树 二叉排序树 // 二叉排序树节点 typedef struct BSTNode{ElemType key;struct BSTNode *lchild, *rchild; } BSTNode, *BSTree;五叉查找树 // 5叉排序树的节点定义 struct Node{ElemType keys[4]; // 5叉查找树一个节点最多4个关键字struct…...

openfeign返回消息报错.UnknownContentTypeException

1. springcloud项目使用openfeign报错 org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [com.yl.base.Result<java.util.List<com.yl.entity.LabelConfig>>…...

[Linux入门]---Linux项目自动化构建工具-make/Makefile

目录 1.背景2.make指令输入make默认为Makefile文件第一条指令执行Makefile文件对gcc指令特殊处理及原理特殊符号 3.总结 1.背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放…...

[Python进阶] 程序打包之Pyinstaller参数介绍

5.4 Pyinstaller参数介绍 5.4.1 选项参数 参数名 说明 -h、–help 查看Pyinstaller所有命令的用法和帮助 -v、–version 查看当前Pyinstaller版本 –distpath DIR 设置dist位置&#xff0c;默认当前目录 –workpath WORKPATH 设置build位置&#xff0c;默认当前目录 -y、–no…...

Python中如何判断列表中的元素,是否在一段文本中??

#我的Python教程 #官方微信公众号&#xff1a;wdPython1.要判断列表中的每个元素是否在一段文本中&#xff0c;可以使用Python中的字符串的 in 运算符来实现。以下是一个示例代码&#xff1a; text "Hello, how are you today?" word_list ["Hello", &…...

spark Structured报错解决

报错&#xff0c;不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…...

Matter 协议系列:发现

Commissionable 发现 Commissionable 发现发生在投入使用&#xff08;未绑定&#xff09;之前&#xff0c;指的是发现和识别Commissionable 节点的过程。有三种方法可以通过这些方法中的任何一种来 广播Commissionable 的节点&#xff1a; 蓝牙低功耗&#xff08;BLE&#xff…...

Oracle 12c Docker镜像配置SSL

一、Docker运行Oracle 12c服务 a.拉取镜像 docker pull truevoly/oracle-12cb.运行 docker run -d -p 1521:1521 -p 2484:2484 -v /data/oracle/:/opt/oracle --name oracle_12c truevoly/oracle-12cc.查看日志 docker logs -f oracle_12cd.出现如下信息&#xff0c;则启动…...

版本控制系统git:一文了解git,以及它在生活中的应用,网站维护git代码,图导,自动化部署代码

目录 1.Git是什么 2.git在生活中的应用 2.1git自动化部署代码 3.网站维护git代码 3.1如何在Git代码托管平台等上创建一个仓库 3.2相关文章 4.ruby实现基础git 4.1.Git add 4.2 Git commit 4.3 Git log 1.Git是什么 Git是一个版本控制系统&#xff0c;它可以追踪文件的…...

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…...

从零开始的 MyBatis 拦截器之旅:实战经验分享

文章目录 MyBatis拦截器可以做什么&#xff1f;Mybatis核心对象介绍四大核心对象如何实现&#xff1f;接口讲解Interceptor接口intercept方法plugin方法setProperties 完整SQL打印拦截器实战拦截器实现拦截器注册 MyBatis拦截器可以做什么&#xff1f; MyBatis拦截器是MyBatis…...

网络编程day05(IO多路复用)

今日任务&#xff1a; TCP多路复用的客户端、服务端&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> …...

人声分离网站,帮你快速提取视频中的人声和背景音乐

今天给大家带来一个可以分离人声的网站——音分轨&#xff0c;他运用人工智能算法可以将音频中的人声部分和音乐部分分离&#xff0c;使我们的视频制作过程可以更方便。 我们点击右下角“选择文件”上传一个音频&#xff0c;上传好音频后&#xff0c;人工智能就开始处理我们上传…...

计算机网络常见问题

1.谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 1.1.为什么要分层&#xff1f; 在计算机中网络是个复杂的系统&#xff0c;不同的网络与网络之间由于协议&#xff0c;设备&#xff0c;软件等各种原因在协调和通讯时容易产生各种各样的问题。例如&#xff1a;各物流…...

上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技

备受瞩目的杭州第19届亚运会&#xff0c;将于9月23日正式开幕。据悉&#xff0c;这也是有史以来项目最多的一届亚运会&#xff0c;除部分传统奥运项目外&#xff0c;还包含武术、藤球、板球、克柔术、柔术等亚洲特色项目&#xff0c;以及霹雳舞、电子竞技等深受年轻人喜爱的新兴…...

无重复字符的最长子串 - 力扣(LeetCode)

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长…...

企业行政许可的种类有哪些?

从行政许可的性质、功能和适用条件的角度来说&#xff0c;大体可以划分为五类&#xff1a;普通许可、特许、认可、核准、登记。 1.普通许可 普通许可是一种允许符合特定条件的相对方行使某种权利的行为。在许多情况下&#xff0c;需要普通许可的活动都与国家安全、公共安全息…...

Flink--4、DateStream API(执行环境、源算子、基本转换算子)

星光下的赶路人star的个人主页 注意力的集中&#xff0c;意象的孤立绝缘&#xff0c;便是美感的态度的最大特点 文章目录 1、DataStream API1.1 执行环境&#xff08;Execution Environment&#xff09;1.1.1 创建执行环境 1.2 执行模式&#xff08;Execution Mode&#xff09;…...

#循循渐进学51单片机#指针基础与1602液晶的初步认识#not.11

1、把本节课的指针相关内容&#xff0c;反复学习3到5遍&#xff0c;彻底弄懂指针是怎么回事&#xff0c;即使是死记硬背也要记住&#xff0c;等到后边用的时候可以实现顿悟。学会指针&#xff0c;就是突破了C语言的一道壁垒。 2&#xff0c;1602所有的指令功能都应用一遍&#…...

Lua学习笔记:探究package

前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级…...

【面试经典150 | 双指针】三数之和

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;暴力枚举方法二&#xff1a;双指针 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对…...

做网站的去那里接单/天津关键词优化平台

错误示范&#xff1a; public void approve(final long bookId) {bookId10;}...

网站可以做哪些内容/app网络推广方案

关键词导读&#xff1a;导出Excel Java导出Excel Java导出有格式ExcelJava有什么方便的类库导出带格式的Excel吗&#xff1f;部分数据如下&#xff1a;ORDERID CUSTOM ORDERDATE FREIGHT10262 Learnthe kernel trade 1996-07-22 48.29 10263 Resources are people 1996-07-23 1…...

如何用运行打开wordpress/网络推广平台软件

我很惊讶于软件人员的开发速度&#xff0c;不少项目可以2周甚至3天就迅速地做出来。然而&#xff0c;后续却没有进一步持续地运营&#xff1a;扔到园子里&#xff0c;让它自生自灭&#xff0c;这不是互联网的模式。运营&#xff0c;是互联网的重要法宝&#xff1b;但需要盯着一…...

帮助中心网站源码/直通车推广计划方案

Python内置了整数、复数、浮点数三种数字类型。整数 整数是没有小数部分的数值&#xff0c;与数学上的一样&#xff1a; >>> 1 1 >>> -1 -1 整数没有大小限制&#xff0c;只要你的内存足够大&#xff0c;就可以创建任意大小的整数&#xff1a; >>> …...

微信红包开发平台/百度seo优化方案

一、DLL文件常识DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。在Windows中&#xff0c;许多应用程序并不是一个完整的可执行文件&#xff0c;它们被分割成一些相对独立的动态链接库&#xff0c;即DLL文件&#xff0c;放置于系统中。当我们执行某一个程序时&…...

浙江网站建设/电商平台推广公司

* android.telephony.TelephonyManager类作用&#xff1a;访问设备上的电话通讯服务的信息获取方法&#xff1a;Context.getSystemService(Context.TELEPHONY_SERVICE)获取* GsmCellLocation类作用&#xff1a;封装GSM移动电话的基站信息具体代码实现&#xff1a;// 获取Teleph…...