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

时间:2012-08-10 13:06:12

标签: c++ string qt data-structures

我正在处理一组对象,其中合理的大小可以在1到50K之间(但没有设置上限)。每个对象都包含一些字符串。

我想实现一个搜索函数,它可以部分地,精确地或RegEx匹配这些字符串中的任何一个,然后返回一个对象列表。

如果每个对象只包含一个字符串,那么我可以简单地按字典顺序对它们进行排序,并相当容易地拉出范围 - 但由于速度的原因,我不愿意为每个包含的字符串实现map类似的结构/记忆问题。

是否有适合这种速度和内存效率的数据结构?我感觉数据库可能即将出现,但我对它们知之甚少,所以我想推迟研究,直到有更多知识渊博的人能够朝着正确的方向推动我!

3 个答案:

答案 0 :(得分:1)

类似地图的集合可能是您最好的选择,键将是字符串,值是对包含对象的引用。如果你的字符串作为stl字符串保存在对象中,那么你可以在地图的关键部分存储对数据的引用(或者使用shared_ptr作为字符串并在对象和地图中引用它们)< / p>

搜索,排序只是实现使用解除引用数据的custom search functor。地图的大小将是2个引用加上地图开销,如果您认为替代方案将是大的,如果不是更大,则不会那么糟糕。

答案 1 :(得分:1)

  

部分,完全或RegEx匹配这些字符串中的任何一个并随后返回对象列表

嗯,对于完全匹配,您可以拥有std::map<std::string, std::vector<object*> >。键是精确的字符串,vector保存指向匹配对象的指针,其中许多指针可能指向单个对象实例。

你可以有一个从部分字符串到完整字符串的前端映射:说字符串是“顽固的”,你不得不把条目放入“顽固”,“ogged”,“gged”,“ged” “,”ed“和”d“(如果你想要最小匹配大小,可以在任何地方停止)...然后使用lower_bound进行搜索。这样,说你搜索“狗”,你仍然可以看到有一个“顽固”的匹配(如果它匹配说“dogfood”无关紧要。这将是一个简单的std::map<string, string>。当你从lower_bound位置开始向前增加并且字符串仍然匹配(即从dogfood到dogged到......直到它不以dog开头),你可以在“完全匹配”地图中搜索并聚合结果。

对于正则表达式,我没有任何好的建议......我会从蛮力搜索所有完整的字符串开始。如果它真的不够好,那么你会做一些粗略的优化,比如在进行强力匹配之前检查一个常量子串来过滤,但我想象如何彻底和快速地完成这个操作。

(如果有用的话,用你最喜欢的智能指针代替object*

答案 2 :(得分:1)

感谢所有回复,但是继续使用此post中提到的技术后,我决定使用仅限标题SeqAn项目中的增强后缀数组。