c++ - 仅匹配集合中的某些字段
问题描述
背景
我正在尝试使用散列查找公共子字符串,为此我首先遍历我的第一个字符串并创建一个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 很可能无法解决它。
推荐阅读
- javascript - 想阅读网页浏览器上显示的网址
- c++ - 如何从文件中存在的路径中检索环境变量,
- java - 为什么 set.size() 对 String 和 Java Object 显示不同的值?
- excel - 使用单个标准的多个值
- laravel - 签名路由未定义 laravel
- javascript - 如何使用 Date() 对象设置特定区域时区以正确计算两个事件之间的时间
- html - 如何从此圆形图标中删除黑色边框?
- matlab - 有没有使用逻辑索引向量提取子张量的函数?
- ios - React-native 自定义原生模块无法搜索标题搜索路径
- python - 如何将熊猫数据框保存到具有特定文件名的 .csv?