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

  1. java 替换第二个字符_字符串替换第二个相同的字符

    r语言如何把字符串中连续的几个相同的字符替换为一比如abbccccdd,替换为abcd保罗?科贺:没有一颗心,会因为追分享梦想而受伤. jquery 把字符串中的某个字符全部替换 start.repl ...

  2. python给定字符串显示奇数_字符串基础练习题80+道(原文及代码见文尾链接)

    Python 字符串基础练习题80+道 1.编写一个Python程序来计算字符串的长度. 2.编写一个Python程序来计算字符串中的字符数(字符频率). Sample String:google.c ...

  3. java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?

    AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...

  4. java记事本查找_记事本的查找技术

    首先你会将记事本的外观都做好.文本区域推荐使用JTextArea.假如这个文本的变量命名为jTextArea.接下来我开始写算法了.建立一个类FindMethod,专门用来计算查找的算法. publi ...

  5. linuxsed替换字符串后保存_字符串方法——replace()

    1.字符串方法-- replace() str.replace(old, new[,max]) 参数说明(Parameters) old:被替换的字符串 new:新字符串,替换原来的old字符串 ma ...

  6. mysql查询两张表的同一列_如何快速查找两个数据表之间的相同和不同?

    原标题:如何快速查找两个数据表之间的相同和不同? 知识 随笔 案例 声音 其他 编者按 工作中经常会遇到对来源不同的数据进行比对,查找相同.不同.差异性等.过于复杂的需求,我们通常会转换思路,使用数据 ...

  7. 查找窗口隐藏了怎么办_如何快速查找网站管理页面

    很多时候,对任何URL进行扫描以查找其漏洞时,渗透测试者或安全研究人员都会尝试查找管理页面(" admin",控制面板或登录名). 登陆任何网站的任何管理页面是任何网站的严重漏洞. ...

  8. java转安卓快吗_安卓Kotlin开发系列之Java快速转Kotlin

    原标题:安卓Kotlin开发系列之Java快速转Kotlin 自从Kotlin被宣布为Android开发语言的官方支持后,如今可谓是火的一塌糊涂,作为一名Android程序员,如何快速爬坑?今天为大家 ...

  9. spring字符串判空_字符串工具类StringUtils实现字符串是否中文、字符串分割/判空/替换/查找、是否包含乱码及字符串数组合并等常规操作...

    一.前言 关于字符串工具类StringUtils实现字符串是否包含isChinese中文.是否包含isMessyCode乱码.常规数据类型转换.替换/删除/判空.两字符串数组mergeStringAr ...

最新文章

  1. matlab能修图吗,相机上这个“功能”,不打开会影响修图效果,别等拍完照片才知道...
  2. oracle 存储过程 输入,Oracle 存储过程加密方法
  3. 不再以讹传讹,GET和POST的真正区别
  4. Archive object standard check
  5. jQuery 表单选择器
  6. 【mybatis系列】自定义实现拦截器插件Interceptor
  7. mac系统和鸿蒙,鸿蒙发力,或将超越苹果系统
  8. linux shell 字典 定义 新增元素
  9. 一个前端写的php博客系统--支持markdown哦
  10. 解决树莓派aplay找不到声卡的问题
  11. MeteoInfo 生成等值面
  12. 未知usb设备(设备描述请求失败)_USB 之传输事务
  13. 我的程序人生——初识代码,从学好C语言开始
  14. 【苹果家庭推送】iMessage Number是一种及时静态(Differential Privacy)
  15. 火线 地线 零线 漫谈
  16. 尚硅谷-离线数仓-笔记
  17. (CVPR-2022)AdaViT:用于高效图像识别的自适应视觉变换器
  18. 手机号批量查询归属地方法及其简介批量查询号码归属地方法
  19. 异步爬虫(高效爬虫)
  20. vue-seamless-scroll 使用

热门文章

  1. Win10中的IIS10安装php manager和IIS URL Rewrite
  2. 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
  3. Linux systemd limits
  4. input只改变光标的颜色 不改变字的颜色
  5. leetcode 290 Word Pattern
  6. 【贪心】[USACO 2015 February Contest, Gold]Circular Barn
  7. 如何使用SwitchyOmega.crx谷歌插件
  8. 解决:IE中不能自动选择UTF-8编码的解决方法
  9. Java中的两种异常类型及其区别?
  10. SpringBoot 接收 单个String入参之解决方案