我正在处理一组对象,其中合理的大小可以在1到50K之间(但没有设置上限)。每个对象都包含一些字符串。
我想实现一个搜索函数,它可以部分地,精确地或RegEx匹配这些字符串中的任何一个,然后返回一个对象列表。
如果每个对象只包含一个字符串,那么我可以简单地按字典顺序对它们进行排序,并相当容易地拉出范围 - 但由于速度的原因,我不愿意为每个包含的字符串实现map
类似的结构/记忆问题。
是否有适合这种速度和内存效率的数据结构?我感觉数据库可能即将出现,但我对它们知之甚少,所以我想推迟研究,直到有更多知识渊博的人能够朝着正确的方向推动我!
答案 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)