c++ - 仅匹配集合中的某些字段

标签 c++ hash stl set

背景
我正在尝试使用哈希查找常见的子字符串,为此,我首先遍历我的第一个字符串,并创建一个set<pair<int,int>>,该代码保存来自两个不同哈希函数的哈希值,用于长度可能为'l'的子字符串。然后,我遍历第二个字符串以及长度为'l'的子字符串。我计算哈希对,并检查它们是否存在于集合中。
问题
我需要找到子字符串的开头,同时还要利用诸如STL::set提供的更快的查找时间。我不能使用distance(set.begin(),set.myValue'sPos),因为该集会自动排序。
解决方案尝试

  • 我曾想过使用{ Hash val1, Hash val2, startPos}创建一个结构,但是之后我将无法使用find函数,因为string1和string2的子字符串的startPos会有所不同。
  • 我知道我可以为结构修改==运算符以使用find函数,但是我担心它会影响其运行时间吗?

  • (TL; DR-简单来说,修改==操作是否会影响STL find函数的运行时间)
    有什么更好的方法吗?
    问题的例子
    说我的字符串是'abcd' and 'dcfcd',我要寻找的长度是2。
    在集合中-插入hash('ab'), hash('bc') and hash('cd')。 (每个都是一对int,即从两个diff hash fns获得的数字)。
    然后,我遍历第二个字符串,并检查集合中是否存在hash('dc'), hash('cf'),hash('fc') and hash('cd')hash('cd')确实存在于集合中,现在我想知道'cd'在两个字符串中的位置。
    对于“dcfcd”,这很简单,因为我可以从循环中获取值。但是我还需要在“abcd”中找到“cd”的位置。如果容器没有排序,那么我会知道“cd”是容器的第三个元素,因此位于位置3。

    最佳答案

    您可以使用set.find()。
    据我所知,当搜索一组特定对象时,您会受到性能影响。 std::set极有可能无法解决它。

    关于c++ - 仅匹配集合中的某些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560828/

    相关文章:

    c++ - 积分推广与运营商+=

    c++ - 在其他类中声明的私有(private)成员

    c - 滚动哈希的实现对使用 Rabin Karp 进行字符串匹配没有帮助

    c++ - 可变线程与非常量方法

    c++ - 使用自定义排序函数对 vector<string> 中的字符串进行排序时出现段错误

    c++ - 为什么 sizeof(std::vector<int>) 返回 16 个字节,而它似乎有 20 个字节的成员数据?

    使用自定义交换的 C++ 排序实现?

    PHP 和 bash 返回不同的哈希结果

    perl - 打印按值排序的 Perl 哈希键和值

    c++ - 有没有简单的方法将 xlnt 包含到 Ubuntu 上的 Visual Studio Code 中?