仅匹配集合中的某些字段

Match only certain fields from a set

本文关键字:字段 集合      更新时间:2023-10-16

Background

我正在尝试使用哈希查找常见的子字符串,为此我首先遍历我的第一个字符串并创建一个set<pair<int,int>>,其中包含来自两个不同哈希函数的哈希值,用于长度为"l"的可能子字符串。然后我遍历第二个字符串和长度为"l"的子字符串。我计算哈希对并检查它们是否存在于集合中。

问题

我需要找到子字符串的开头,同时还要利用 stl::set 提供的更快的查找时间。我无法使用distance(set.begin(),set.myValue'sPos)因为集合会自动排序。

解决方案尝试

  1. 我想用{ Hash val1, Hash val2, startPos}创建一个结构,但这样我将无法使用 find 函数,因为 string1 和 string2 的子字符串的 startPos 会有所不同。

  2. 我知道我可以修改结构的 == 运算符以使用 find 函数,但我担心它会影响它的运行时间?

(TL;DR - 简单来说,修改 == 操作会影响 stl find 函数的运行时间(

有没有更好的方法可以做到这一点?

问题示例

假设我的字符串'abcd' and 'dcfcd',我正在寻找的长度是 2。

在集合中 - 插入hash('ab'), hash('bc') and hash('cd')。(每个都是一对 int,从两个差异哈希 fns 获得的数字(。

然后我遍历第二个字符串并检查集合中是否存在hash('dc'), hash('cf'),hash('fc') and hash('cd')hash('cd')确实存在于集合中,现在我想知道"cd"在两个字符串中的位置。

对于"dcfcd",这很简单,因为我可以从循环中获取值。但我还需要在"abcd"中找到"cd"的位置。如果容器没有排序,那么我会知道"cd"是容器的第三个元素,因此位于位置 3。

你可以使用 set.find((。 据我所知,在搜索某些对象时,您会受到性能影响。使用std::set很可能没有办法绕过它。