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