我有一个大约50个关键字和大约50000个字符串的列表。我检查每个字符串是否包含至少一个关键字。我对匹配关键字或匹配关键字的数量不感兴趣。我只想尽快回复“真实”或“假”。
所以,我打赌那里的算法远远超过我目前的LINQ版本:
class MyEnumerableExtension
{
public static bool ContainsAny(this string searchString, IEnumerable<string> keywords)
{
return keywords.Any(keyword => searchString.Contains(keyword))
}
}
bool foundAny = "abcdef".ContainsAny(new string[] { "ac", "bd", "cd" } );
答案 0 :(得分:1)
这个本质上与你今天Efficient algorithm for finding all keywords in a text的其他问题基本相同,除非经过修改以便在找到匹配后返回吗?
答案 1 :(得分:0)
有multiple algorithms在文本中搜索一组子字符串。
答案 2 :(得分:0)
答案 3 :(得分:0)
快速分析显示您正在迭代搜索关键字。如果您可以在一个关键字中搜索所有关键字,那么您的算法应该会有一个整体改进。 Regex表达式可以做到并将它与“Compiled”选项结合起来,你应该开始看到性能提升(因为它会单独传递所有关键字的字符串)。但是,如果您有多个关键字,它只会让您受益。这是一个快速的想法,可以帮助你,但请注意,我实际上没有根据你的算法测试性能。
string[] keywords = { "ac", "bd", "cd" };
string[] tosearch = { "abcdef" };
string pattern = String.Join("|", keywords);
Regex regex = new Regex(pattern, RegexOptions.Compiled);
foundAny = regex.IsMatch(String.Join("|", tosearch));
另请注意,只要您的关键字不包含任何正则表达式特殊字符(并且您的搜索字符串不包含管道符号),此功能就可以使用。但是,可以使用转义序列来克服特殊字符,并且搜索字符串不会必须像我一样加入。