首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >提高字符串前缀匹配性能

提高字符串前缀匹配性能
EN

Stack Overflow用户
提问于 2021-08-23 09:23:17
回答 4查看 369关注 0票数 1

我正在寻找一种方法来加快我天真的字符串匹配过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Treat this as pseudo code
function find(input: string, prefixes: string[]) {
  for (let i = 0; i < prefixes.length; i++) {
    const prefix = prefixes[i];
    
    if (input.startsWith(prefix)) {
      return prefix;
    }
  }

  return null;
}

const prefixes = [ "Hey", "Hi", "Hola", ... ];
const prefix = find("Hey, I'm Michael", prefixes);

我研究了一些概率数据结构,比如布卢姆过滤器,但我找不到适合我需要的结构。尽管如此,我并不想得到匹配的前缀,我也不需要100%的保证匹配。我只需要知道输入是否肯定不包含任何前缀,或者它是否包含前缀。

我还遇到了一篇关于突发尝试算法的文章,据我所知,该算法将起到类似的作用。坦率地说,尽管我对算法的研究还不够深入,无法掌握完整的实现细节并确保这正是我所要寻找的。

附带注意:我假设这个函数得到的99.95%的输入将与任何前缀不匹配。因此,我希望这是一个优化步骤,只处理可能有前缀的字符串。

如有任何帮助或建议,我们将不胜感激:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-08-23 15:59:21

如果预先知道前缀并可以进行预处理,则可以尝试trie。特别是如果他们要短到10个字符。这意味着每一次检查都要进行10次比较。不知道一个人能做什么更好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function buildTrie(trie, words){
  for (let word of words){
    let _trie = trie;

    for (let i=0; i<word.length; i++){
      const letter = word[i];
      _trie[letter] = _trie[letter] || {};

      if (i == word.length - 1)
        _trie[letter]['leaf'] = true;

      _trie = _trie[letter];
    }
  }

  return trie;
}


function find(trie, str, i=0){
  const letter = str[i];
  
  if (!trie[letter])
    return false;
    
  if (trie[letter]['leaf'])
    return true;
    
  return find(trie[letter], str, i + 1);
}


const prefixes = [ "Hey", "Heya", "Hi", "Hola"];
const trie = buildTrie({}, prefixes)

console.log(trie)

console.log(find(trie, "Hey, I'm Michael"));
console.log(find(trie, "Heuy, I'm Michael"));

票数 2
EN

Stack Overflow用户

发布于 2021-08-24 07:50:49

这与答案的גלעדברקן没有逻辑上的区别,但它显示的是以完全不同的代码样式使用trie。(它还使用$而不是leaf作为终止符;符号是一个很好的选择。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const trie = (words) => 
  words .reduce (insertWord, {}) 
const insertWord = (trie, [c, ...cs]) => 
  c ? {...trie, [c]: insertWord (trie [c] || {}, cs)} : {...trie, $: 1}
const hasPrefix = (trie) => ([c, ...cs]) =>
  '$' in trie ? true : c ? c in trie && hasPrefix (trie [c]) (cs) : true
const testPrefixes = (prefixes) => 
  hasPrefix (trie (prefixes))

const hasGreeting = testPrefixes (["Hey", "Hi", "Hola", "Howdy"])

console .log (hasGreeting ("Hey, I'm Michael"))
console .log (hasGreeting ("Hello, Michael. I'm Michelle"))

console .log (trie ((["Hey", "Hi", "Hola", "Howdy"])))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.as-console-wrapper {max-height: 100% !important; top: 0}

testPrefixes接受前缀列表,并返回一个函数,该函数将报告字符串是否以其中一个前缀开头。它通过创建一个trie并将其部分应用于hasPrefix来做到这一点。在内部,trie是通过在初始空对象上折叠insertWord构建的。

当然,只有当您的用例有用于多个调用的前缀时,这才有意义。如果不是,我看不出比const testPrefixes = (prefixes) => (word) => prefixes .some ((pfx) => word .startsWith (pfx))更好

票数 1
EN

Stack Overflow用户

发布于 2021-08-23 20:06:06

为了在字符串中搜索许多可能的子字符串,可以使用拉宾-卡普算法中的idea。

在我的程序班莫伦中,我使用这个算法通过搜索子字符串选择恶意请求。请参阅github上的源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68896660

复制
相关文章
索引优化 最左前缀匹配原则
索引是有序的,index1索引在索引文件中的排列是有序的,首先根据a来排序,然后才是根据b来排序,最后是根据c来排序,像select * from tab 这种类型的sql语句,在a、b走完索引后,c肯定是无序了,所以c就没法走索引,数据库会觉得还不如全表扫描c字段来的快。
用户7737280
2020/09/09
1.5K0
索引优化  最左前缀匹配原则
字符串匹配算法_多字符串匹配
从好后缀的后缀子串中,找一个最长的且和模式串的前缀子串匹配的 {v},滑动至 {v} 对齐
全栈程序员站长
2022/09/25
1.8K0
字符串匹配算法_多字符串匹配
字符串的匹配算法_多字符串匹配
不要被事物的表面现象所迷惑,这个算法全称:Brute Force,有个拉风的中文名:暴力匹配算法。
全栈程序员站长
2022/09/25
2.2K0
字符串的匹配算法_多字符串匹配
Java字符串匹配_正则匹配替换字符串
public static void main(String args[]) {
全栈程序员站长
2022/09/24
2.6K0
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。
全栈程序员站长
2022/09/24
1.7K0
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配
问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。 输入格式   输入的第一行包含一个字符串S,由大小写英文字母组成。   第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。   第三行包含一个整数n,表示给出的文字的行数。   接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。 输出格式   输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。 样例输入 Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello 样例输出 HelloWorld HiHiHelloHiHi HELLOisNOTHello 样例说明   在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。 评测用例规模与约定   1<=n<=100,每个字符串的长度不超过100。
geekfly
2022/05/06
8280
字符串匹配算法 -- 朴素匹配
为什么叫做朴素匹配,我理解的就是这是一种寻常想法,简单粗暴的算法。是一种暴力的算法,不考虑其时间复杂度以及效率。只要达到匹配的目的即可。
lexingsen
2022/02/24
1.9K0
字符串匹配算法 -- 朴素匹配
字符串匹配算法_字符串模式匹配算法
网络信息中充满大量的字符串,对信息的搜寻至关重要,因此子字符串查找(即字符串匹配)是使用频率非常高的操作:给定一段长度为N的文本和长度为M的模式字符串(N≥M),在文本中找到一个和模式串相匹配的子串。由这个问题可以延伸至统计模式串在文本中出现的次数、找出上下文(和该模式串相符的子字符串周围的文字)等更复杂的问题。
全栈程序员站长
2022/08/02
2.9K0
字符串匹配算法_字符串模式匹配算法
B+树索引使用(7)匹配列前缀,匹配值范围(十九)
上篇文章索引的代价,b+树占的空间比较大,增删改对b+树每个节点的索引排序影响也很大,时间耗费长,所以没有必要不要乱建索引,还介绍了索引的最左原则和全值查询。
用户9919783
2022/07/26
9990
用SQL高性能解决字符串的连续匹配
高性能解决有序集合的连续匹配问题 场景: A集合有8个元素:ali、boy、c、dog、e、f、g、h, B集合有5个元素:boy、c、dog、e、h 问B中是否包含连续4个以上的A集合元素?是即符合要求。 查阅网络资料甚至咨询论坛、技术群里的朋友,尽管方法各异,本质上还是循环遍历,最多考虑了利用bitmap提升下循环匹配性能。 难点:连续4个以上的计算与匹配 不论是集合还是字符串,4个连续的判断与匹配基本都依赖循环遍历算法,不论是KMP还是Boyer-Moore算法,如果一行记录都需要这么复杂的循环
企鹅号小编
2018/01/31
7580
用SQL高性能解决字符串的连续匹配
提高Java性能
Java 的许多细节和性能标志都可以影响应用的性能,只不过从来都没有一个叫 -XX:+RunReallyFast 的神奇标志。
宇宙之一粟
2021/01/13
6800
最新邮箱匹配正则(邮箱前缀可包含"_")
/** * 校验邮箱格式 * * @param email * @return * @author shijing * 2015年11月10日下午6:17:59 */ public static boolean checkEmail(String email) { String check = "^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$"; Pattern
执笔记忆的空白
2020/12/25
1.8K0
OpenCV4.5.1 | 使用一行代码将图像匹配性能提高14%
opencv4.5.1中最令人兴奋的特性之一是BEBLID(Boosted effective Binary Local Image Descriptor),它是一种新的描述符,能够在减少执行时间的同时提高图像匹配精度!本文将向你展示一个具体的例子,所有源代码都存储在此GitHub存储库中:
AI算法与图像处理
2021/04/21
1.2K0
OpenCV4.5.1 | 使用一行代码将图像匹配性能提高14%
高性能mysql之前缀索引
有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
johnhuster的分享
2022/03/28
6550
字符串 模式匹配
本文介绍了什么是程序员的内功——算法以及其重要性。算法是程序的核心,它能够高效地解决问题。文章通过一些例子详细讲解了算法的概念和其具体实现,并探讨了算法对于程序员的职业发展以及日常生活中的影响。
静默虚空
2018/01/05
1.5K0
字符串 模式匹配
python3 三种字符串(无前缀,前缀
首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下:
py3study
2020/01/07
6930
【特征匹配】开源 | 基于图卷积网络的线匹配性能表现SOTA,查全率从45.28%提高到70.47%
论文地址:http://arxiv.org/pdf/2004.04993v2.pdf
CNNer
2020/06/19
7470
【特征匹配】开源 | 基于图卷积网络的线匹配性能表现SOTA,查全率从45.28%提高到70.47%
【CCF】字符串匹配
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
9950
bash字符串匹配
#!/bin/sh foo() {     local basedir=$1     local all_entries=`ls -c`     for entry in $all_entries     do           if test -d $entry; then             cd $entry&&foo ${basedir}/$entry;cd - >/dev/null         else             if [[ $entry
一见
2018/08/07
1K0
字符串匹配问题
、字符串匹配问题 【问题描述】        字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。 【输入格式】strs.in        文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。 【输出格式】strs.out        在输出文件中有N行,每行都是
attack
2018/04/12
1.5K0

相似问题

提高字符串匹配性能

30

提高find_by方法匹配字符串的性能?

13

如何提高数据片匹配性能?

12

如何提高匹配算法的性能

21

如何提高es匹配查询性能

142
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文