我有一个字符串列表,需要找到哪些字符串与给定的输入值匹配。 我存储这个字符串列表并能够搜索它的最有效方式(内存与执行速度)是什么?字符串列表的启动和加载并不重要,但搜索的响应时间是。
我应该使用List或HashSet还是只使用基本字符串[]或其他东西?
答案 0 :(得分:10)
这在很大程度上取决于字符串的性质和集合的大小。根据集合的特征和预期的搜索字符串,有一些方法可以非常巧妙地组织事物,以便搜索速度非常快。你还没有把这些信息告诉我们。
但这就是我要做的。我设定了合理的性能要求。然后我会尝试一个n-gram索引(为什么?因为你在评论中说你需要考虑部分匹配; HashSet<string>
在这里不会帮助你)而且我会描述我期望的合理输入针对此解决方案,看看它是否符合我的性能要求。如果确实如此,我会接受解决方案并继续前进。如果没有,我会非常仔细地考虑我的表现要求是否合理。如果是的话,我会开始思考我的输入和收藏是否有什么特别的东西可以让我使用更聪明的解决方案。
答案 1 :(得分:4)
似乎最好的方法是在O(input_len)时间内构建输入的后缀树,然后在O(pattern_length)时间内查询模式。因此,如果您的文字与您的模式相比非常大,那么这将很有效。
参见Ukkonen用于构建后缀树的算法。
如果你想要不精确的匹配......请参阅Gonzalo Navarro的作品。
答案 2 :(得分:1)
使用Dictionary<string>()
或HashSet<string>
可能对您有用。
答案 3 :(得分:-1)
Dictionary和Hashtable在“搜索”中将是最快的,因为它是O(1)速度。字典和Hashtables有一些缺点,因为它们没有排序。
使用二进制搜索树,您将能够进行O(Log N)搜索。
使用未排序的列表,您将以O(N)的速度进行搜索。
使用排序列表,您将获得O(Log N)搜索,但请记住,必须对列表进行排序,以便为整体速度增加时间。
至于内存使用,请确保初始化集合的大小。
所以字典或哈希表是最快的检索。
从最佳到最差的速度分类 O(1) O(log n) 上) O(n log n) 为O(n ^ 2) O(2 ^ n)的
n是元素的数量。