快速算法,用于查找字符串是否包含给定数组中的任何字符串

时间:2010-11-18 13:37:09

标签: c# algorithm search

我有一个大约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" } );

4 个答案:

答案 0 :(得分:1)

这个本质上与你今天Efficient algorithm for finding all keywords in a text的其他问题基本相同,除非经过修改以便在找到匹配后返回吗?

答案 1 :(得分:0)

multiple algorithms在文本中搜索一组子字符串。

答案 2 :(得分:0)

哟可以实施Knuth-Morris-Pratt algorithm

答案 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));

另请注意,只要您的关键字不包含任何正则表达式特殊字符(并且您的搜索字符串不包含管道符号),此功能就可以使用。但是,可以使用转义序列来克服特殊字符,并且搜索字符串不会必须像我一样加入。