有效地查找以另一个字符串</string>开头的List <string>的所有元素

时间:2014-11-11 23:14:42

标签: c# .net string startswith

我有一个字符串列表。我想找到所有以另一个字符串开头或结尾的字符串。最简单的例子是:

List<string> allWords = new List<string>();

for(int index = 0; index < 1000000; index++)
    allWords.Add(index.ToString());

List<string> result = allWords.FindAll(x => x.StartsWith("10") || x.EndsWith("10"));

此算法从头到尾扫描列表。我需要非常快速地执行此操作,并且O(n)太慢。

我可以使用哪些数据结构(如果有的话)来更快地解决此算法O(n)?

2 个答案:

答案 0 :(得分:4)

如果您有未分类的List<string>,则无法在O(n) 之内执行此操作。但是,您可以使用不同的数据结构。 trie(也称为前缀树)特别适合您的需要,因为它具有O(m)搜索复杂度(其中m是搜索前缀的长度)

我在这里有一个C#实现:Trie.cs(实际上,它是一个基于trie的字典,它将值与每个键相关联,但对于您的用例,您可以忽略该值;或者如果您愿意您可以根据需要调整实施方案。)

答案 1 :(得分:0)

  1. 要查找以给定子字符串开头的字符串sort列表,请执行binary search查找最接近的匹配项,然后扫描相邻字符串以查找与开头匹配的其他字符串。那个日志(n)

  2. 要查找以给定子字符串结尾的字符串,请创建反向字符串列表,并对该列表进行排序。然后找到以给定模式结束的字符串,反转模式并查找以反转模式开头的反向字符串,如步骤1中所示。