我有一个字符串列表,需要找出与给定输入值匹配的字符串。
在存储这个字符串列表并能够搜索它时,最高效的方法(考虑内存和执行速度)是什么?启动和加载字符串列表不重要,但搜索响应时间很重要。
我应该使用List、HashSet、基本的string[]或其他什么东西?
我有一个字符串列表,需要找出与给定输入值匹配的字符串。
在存储这个字符串列表并能够搜索它时,最高效的方法(考虑内存和执行速度)是什么?启动和加载字符串列表不重要,但搜索响应时间很重要。
我应该使用List、HashSet、基本的string[]或其他什么东西?
这要看字符串的特性和集合的大小。根据集合的特征和预期的搜索字符串,可以通过巧妙地组织来实现快速搜索。但是您没有提供这些信息。
但是这是我会做的。我会设定一个合理的性能要求。然后我会尝试使用n-gram索引(为什么?因为您在评论中说需要考虑部分匹配; HashSet<string>
在这里无法帮助您),并针对我预期的合理输入对此解决方案进行性能分析,以查看它是否符合我的性能要求。如果符合,我会接受该解决方案并继续前进。如果不符合,我会认真思考我的性能要求是否合理。如果合理,我会开始考虑我的输入和集合是否有什么特殊之处,可能可以使用更聪明的解决方案。
HashSet
。 - jason看起来最好的方式是在O(input_len)时间内构建输入的后缀树,然后在O(pattern_length)时间内查询模式。因此,如果您的文本与您的模式相比真的很大,这将很有效。
请参阅Ukkonen算法以构建后缀树。
如果您想进行不精确匹配...请参阅Gonzalo Navarro的工作。
使用 Dictionary<string>()
或者 HashSet<string>
可能对您有好处。
字典和哈希表是最快的“搜索”方式,因为它们的速度是O(1)。但是,字典和哈希表也有一些缺点,它们不是排序的。
使用二叉搜索树,您将能够获得O(Log N)的搜索速度。
使用未排序的列表,您将获得O(N)的搜索速度。
使用排序的列表,您将获得O(Log N)的搜索速度,但请记住,列表必须排序,这会增加整体速度。
至于内存使用,只需确保初始化集合的大小即可。
因此,字典或哈希表是检索最快的。
从最好到最差的速度分类如下: O(1) O(log n) O(n) O(n log n) O(n^2) O(2^n)
n是元素的数量。
StringCollection
非常慢。它在内部使用ArrayList
。 - vcsjonesStringCollection
不够快。 - jason