概述

由来

在我最早入职的一家公司,主要负责内容方面的业务,对我来说大部分的工作是对内容的清洗和规整。当然,清洗过程免不了的就是按照关键词过滤,你懂的。需求如下:

后台人员添加N个关键字,然后对主站所有的内容进行清洗,含有这些关键字的所有内容都置为无效。

思路

拿到此需求,我最早的方案比较粗暴:针对关键字建立一个HashSet,然后遍历整个数据库,针对每篇文章遍历这个Set,查找是否contains关键字……好吧我承认这不是一个好方法,随着关键字的增多和数据的增多,这个过程消耗的时间成指数型增长!

于是我找到度娘,发现一个算法:DFA。

DFA介绍

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。因为本人算法学的不好,有兴趣的可以看这篇博客: 基于DFA敏感词查询的算法简析

解释起来原理其实也不难,就是用所有关键字构造一棵树,然后用正文遍历这棵树,遍历到叶子节点即表示文章中存在这个关键字。

我们暂且忽略构建关键词树的时间,每次查找正文只需要O(n)复杂度就可以搞定。

针对DFA算法以及网上的一些实现,Hutool做了整理和改进,最终形成现在的Hutool-dfa模块。

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""