【发布时间】:2021-08-23 17:23:17
【问题描述】:
我正在寻找一种方法来加快我的幼稚字符串匹配过程:
// 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% 保证匹配存在。我只需要知道输入是否绝对不包含任何前缀或它可能。
我还看到了一篇关于 Burst Tries 算法的文章,据我所知,该算法将起到类似的作用。坦率地说,虽然我对算法的了解不够深入,无法掌握完整的实现细节并确保这是我正在寻找的。p>
旁注: 我假设这个函数将获得的 99.95% 的输入不会匹配任何前缀。因此,我希望这是一个优化步骤,仅处理可能具有我正在寻找的前缀的字符串。
非常感谢任何帮助或建议:3
【问题讨论】:
-
我们已经讨论了多少个字符串
-
您可以将前缀添加到 trie 中,遍历输入字符串直到没有匹配项。这可能会更快,具体取决于您拥有多少元素。
-
输入约束是什么?前缀字符串的数量。前缀字符串的最大长度。要匹配的字符串数。
-
一种选择是创建 10 个布隆过滤器,每个前缀长度一个。如果每个前缀长度的结果是“绝对不在集合中”,则字符串不匹配。我将构建代码,以便从计算哈希的代码中检查布隆过滤器。换句话说,每个哈希都使用输入中的第一个字符进行更新,并检查 Bloom-length-1 过滤器。添加一个字符,检查 Bloom-length-2 等。大多数情况下,代码必须将哈希值一直到 10 个字符,以证明字符串不匹配。
-
问题是你是否每次都得到新的前缀(函数所暗示的)或者它们很少改变,所以你可以对它们做一些预先计算。在这种情况下,我会选择 MinusFour 的建议。
标签: javascript string algorithm string-comparison