我有300个字符串需要存储和搜索,并且大多数字符串在字符和长度方面都是相同的。例如,我有字符串“ABC1”,“ABC2”,“ABC3”等。和另一组像sample1,sample2,sample3。所以我有点困惑,如何存储它们喜欢使用数组或哈希表。我主要担心的是当我需要从存储中获取一个字符串时,我需要花时间搜索字符串。如果我使用数组,我将不得不在所有索引上进行字符串比较,以便我得到一个。现在,如果我继续使用哈希表,我将不得不处理冲突(显而易见),并且我必须使用链接来存储相同的字符串。
所以我正在寻找一些权衡每种优缺点的建议,并达到最佳实践
答案 0 :(得分:2)
因为密钥很短,往往有一个共同的前缀,你应该考虑基数数据结构,如Patricia trie和三元搜索树(google这些,你会发现很多例子)搜索这些结构的时间往往是O (1)关于条目数和关于密钥长度的O(n)。请注意,长字符串可以使用大量内存。
如果不考虑在基数搜索中不是问题的冲突解决,搜索时间类似于哈希映射。请注意,我正在考虑将哈希计算为哈希映射成本的一部分。人们往往会忘记它。
如果你的密钥往往以随机顺序显示,那么基数结构不具有缓存友好性。正如有人提到的,如果搜索时间非常重要:衡量一些替代方法的表现。
答案 1 :(得分:1)
这取决于您的数据变化的程度。我的意思是,如果你有300个索引字符串引用另一个字符串,那300个索引字符串的变化频率是多少?
您可以使用std :: map进行快速查找,但是第一次创建地图时需要更多资源(与数组,向量或列表相比)。
我主要使用地图用于某种动态查找表(例如:ip to socket)。
所以在你的情况下它看起来像这样:
std::map<std::string, std::string> my_map;
my_map["ABC1"] = "sample1";
my_map["ABC2"] = "sample2";
std::string looked_up = my_map["ABC1"];