0

我有 300 个要存储和搜索的字符串,其中大多数在字符和长度方面是相同的。例如,我有字符串“ABC1”、“ABC2”、“ABC3”等等。和另一组像sample1,sample2,sample3。所以我有点困惑如何存储它们,比如使用数组或哈希表。我主要关心的是当我需要从存储中取出一个字符串时,我花费的时间来搜索一个字符串。如果我使用一个数组,我将不得不对所有索引进行字符串比较才能得出一个。现在,如果我去实现一个哈希表,我将不得不处理冲突(很明显),并且我将不得不实现链接来存储相同的字符串。

因此,我正在寻找一些权衡每种方法的利弊的建议,并得出最佳实践

4

2 回答 2

2

因为键很短,往往有一个共同的前缀,你应该考虑基数数据结构,如 Patricia trie 和三元搜索树(谷歌这些,你会找到很多例子)搜索这些结构的时间往往是 O(1)关于条目数和关于键长度的 O(n)。但请注意,长字符串会占用大量内存。

如果您不考虑在基数搜索中不是问题的冲突解决,则搜索时间类似于哈希图。请注意,我正在考虑将计算哈希的时间作为哈希映射成本的一部分。人们往往会忘记它。

一个缺点是如果您的键倾向于以随机顺序显示,则基数结构对缓存不友好。正如有人提到的,如果搜索时间真的很重要:衡量一些替代方法的性能。

于 2013-10-25T15:10:20.377 回答
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"];
于 2013-10-25T15:07:46.383 回答