【问题标题】:Fast algorithm for finding out if a string contains any string in a given array找出字符串是否包含给定数组中的任何字符串的快速算法
【发布时间】:2010-11-18 13:37:08
【问题描述】:

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

【问题讨论】:

    标签: c# algorithm search


    【解决方案1】:

    除了修改为找到匹配项后返回之外,这与您今天的其他问题Efficient algorithm for finding all keywords in a text 本质上是否相同?

    【讨论】:

    • 不,不是。我有两个不同的担忧。一种是在给定关键字列表中查找包含任何关键字的所有字符串。另一种是通过使用另一个关键字列表来标记这些找到的字符串。这些列表各不相同,用途也不同。
    • 好的,但是两个地方的解决方案是相同的算法(在这种情况下改变为一旦找到一个匹配就返回)?
    • 哎呀,我应该读到最后。我认为您是对的,我可以修改算法以在找到单个关键字后返回。因为我只需要构建一次关键字树,这应该是一个非常快速的解决方案。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以实现Knuth-Morris-Pratt algorithm

      【讨论】:

      【解决方案4】:

      快速分析表明您正在反复搜索关键字。如果您可以一次性搜索所有关键字,那么您的算法应该会有整体改进。 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));
      

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

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 2015-09-08
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        • 2020-12-01
        • 1970-01-01
        相关资源
        最近更新 更多