我有一个字符串列表。我想找到所有以另一个字符串开头或结尾的字符串。最简单的例子是:
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)?
答案 0 :(得分:4)
如果您有未分类的List<string>
,,则无法在O(n)
之内执行此操作。但是,您可以使用不同的数据结构。 trie(也称为前缀树)特别适合您的需要,因为它具有O(m)
搜索复杂度(其中m
是搜索前缀的长度)
我在这里有一个C#实现:Trie.cs(实际上,它是一个基于trie的字典,它将值与每个键相关联,但对于您的用例,您可以忽略该值;或者如果您愿意您可以根据需要调整实施方案。)
答案 1 :(得分:0)
要查找以给定子字符串开头的字符串sort列表,请执行binary search查找最接近的匹配项,然后扫描相邻字符串以查找与开头匹配的其他字符串。那个日志(n)
要查找以给定子字符串结尾的字符串,请创建反向字符串列表,并对该列表进行排序。然后找到以给定模式结束的字符串,反转模式并查找以反转模式开头的反向字符串,如步骤1中所示。