在包含多个字符串的许多对象中查找子字符串

问题描述:

我正在处理的合理大小可能在1到50K之间的任何地方(但没有设置上限)的对象集合。每个对象都包含一些字符串。在包含多个字符串的许多对象中查找子字符串

我想实现一个搜索功能,可以部分,准确地说,或RegEx匹配任何一个这些字符串,然后返回一个对象列表。

如果每个对象只包含一个字符串,然后我可以简单地字典顺序排序,且相对容易地拔出范围 - 但我不愿意执行对每个由于速度/内存的担忧所包含字符串的map状结构。

有没有适合这种速度和内存效率操作的数据结构?我感觉数据库可能在地平线上,但我对它们知之甚少,所以我想暂缓研究,直到有更多知识的人能够将我推向正确的方向!

感谢所有的答复,但在此post提到的技术之后,我已经决定要使用增强后缀数组从仅标头SeqAn项目。

一个类似地图的集合可能是您最好的选择,关键将是字符串,并且该值是对包含对象的引用。如果您的字符串作为stl字符串保存在对象内部,那么您可以将对该数据的引用存储在该映射的关键部分中(也可以使用shared_ptr作为字符串并在对象和地图中引用它们)

搜索,排序只是实现使用解引用数据的custom search functor的问题。地图的大小将为2个引用加上地图开销,如果考虑到替代品的大小(如果不大),则该开销不会太差。

部分,正好,或正则表达式匹配任何一个这些字符串,并随后返回对象的列表

那么,对于完全匹配,你可以有一个std::map<std::string, std::vector<object*> >。关键将是确切的字符串,并且vector保存指向匹配对象的指针,其中许多指针可能指向单个对象实例。

您可以从部分字符串到完整字符串的前端映射表示:如果字符串是“顽固”的,那么您很遗憾必须将条目放入“已修复”,“已ogged”,“gged”,“ ged“,”ed“和”d“(如果您想要最小匹配大小,则停在任何你喜欢的地方)...然后使用lower_bound进行搜索。这样,如果你搜索“狗”,你仍然可以看到有一个“顽强”的匹配(不要紧,如果它匹配说'狗食',这将是一个简单的std::map<string, string>。 lower_bound的位置和字符串仍然匹配(即从dogfood到dogged到......直到它不以狗开始),则可以在“完全匹配”映射中搜索该结果并汇总结果。

对于正则表达式,我没有什么好的建议......我首先在所有完整的字符串中进行强力搜索,如果它不够好,那么你会做一些粗略的优化,比如检查一个常量子字符串,蛮力匹配,但它超出我想象如何做到这一点非常彻底和快速。(代替您最喜欢的智能指针为object*■如果有用)