仅匹配集合中的某些字段
Match only certain fields from a set
Background
我正在尝试使用哈希查找常见的子字符串,为此我首先遍历我的第一个字符串并创建一个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,从两个差异哈希 fns 获得的数字(。
然后我遍历第二个字符串并检查集合中是否存在hash('dc'), hash('cf'),hash('fc') and hash('cd')
。hash('cd')
确实存在于集合中,现在我想知道"cd"在两个字符串中的位置。
对于"dcfcd",这很简单,因为我可以从循环中获取值。但我还需要在"abcd"中找到"cd"的位置。如果容器没有排序,那么我会知道"cd"是容器的第三个元素,因此位于位置 3。
你可以使用 set.find((。 据我所知,在搜索某些对象时,您会受到性能影响。使用std::set很可能没有办法绕过它。
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- C 模板功能在任何集合成员字段上迭代