2012-08-10 101 views
2

我正在處理的合理大小可能在1到50K之間的任何地方(但沒有設置上限)的對象集合。每個對象都包含一些字符串。在包含多個字符串的許多對象中查找子字符串

我想實現一個搜索功能,可以部分,準確地說,或RegEx匹配任何一個這些字符串,然後返回一個對象列表。

如果每個對象只包含一個字符串,然後我可以簡單地字典順序排序,且相對容易地拔出範圍 - 但我不願意執行對每個由於速度/內存的擔憂所包含字符串的map狀結構。

有沒有適合這種速度和內存效率操作的數據結構?我感覺數據庫可能在地平線上,但我對它們知之甚少,所以我想暫緩研究,直到有更多知識的人能夠將我推向正確的方向!

回答

1

感謝所有的答覆,但在此post提到的技術之後,我已經決定要使用增強後綴數組從僅標頭SeqAn項目。

1

一個類似地圖的集合可能是您最好的選擇,關鍵將是字符串,並且該值是對包含對象的引用。如果您的字符串作爲stl字符串保存在對象內部,那麼您可以將對該數據的引用存儲在該映射的關鍵部分中(也可以使用shared_ptr作爲字符串並在對象和地圖中引用它們)

搜索,排序只是實現使用解引用數據的custom search functor的問題。地圖的大小將爲2個引用加上地圖開銷,如果考慮到替代品的大小(如果不大),則該開銷不會太差。

1

部分,正好,或正則表達式匹配任何一個這些字符串,並隨後返回對象的列表

那麼,對於完全匹配,你可以有一個std::map<std::string, std::vector<object*> >。關鍵將是確切的字符串,並且vector保存指向匹配對象的指針,其中許多指針可能指向單個對象實例。

您可以從部分字符串到完整字符串的前端映射表示:如果字符串是「頑固」的,那麼您很遺憾必須將條目放入「已修復」,「已ogged」,「gged」,「 ged「,」ed「和」d「(如果您想要最小匹配大小,則停在任何你喜歡的地方)...然後使用lower_bound進行搜索。這樣,如果你搜索「狗」,你仍然可以看到有一個「頑強」的匹配(不要緊,如果它匹配說'狗食',這將是一個簡單的std::map<string, string>。 lower_bound的位置和字符串仍然匹配(即從dogfood到dogged到......直到它不以狗開始),則可以在「完全匹配」映射中搜索該結果並彙總結果。

對於正則表達式,我沒有什麼好的建議......我首先在所有完整的字符串中進行強力搜索,如果它不夠好,那麼你會做一些粗略的優化,比如檢查一個常量子字符串,蠻力匹配,但它超出我想象如何做到這一點非常徹底和快速。(代替您最喜歡的智能指針爲object*■如果有用)

相關問題