【发布时间】:2020-06-24 17:31:57
【问题描述】:
背景
我正在尝试使用散列查找公共子字符串,为此我首先遍历我的第一个字符串并创建一个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 与 unordered_set 混淆了?您是否有可以发布的代码(带有示例输入和正确的输出)?最后一个问题听起来像“做某事会产生做某事的效果吗?”如果您想知道它是否会改变大 O 时间复杂度,请发布一些代码。
-
嗨,我添加了一个示例代码,如果有帮助请告诉我。实际的散列函数本身与问题无关,所以我没有包括它
-
那不是代码。期望的输出是什么?您想实现 operator== 以提供输出,但您需要整数...并且它返回 bool。有些东西没有加起来。您能否发布一个代码块,我可以将其复制并粘贴到我的开发环境中并查看问题? minimal reproducible example
-
我认为这个例子解释了它:')