代码之家  ›  专栏  ›  技术社区  ›  VVS

判断给定数组中是否包含字符串的快速算法

  •  3
  • VVS  · 技术社区  · 15 年前

    我有一个大约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 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    这和你今天的另一个问题不一样吗 Efficient algorithm for finding all keywords in a text 除了修改为在找到匹配项后返回?

        2
  •  0
  •   Carra    15 年前

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

        3
  •  0
  •   Victor Haydin    15 年前
        4
  •  0
  •   Les    15 年前

    快速分析表明,您正在迭代搜索关键字。如果你能一次搜索所有的关键词,你的算法应该有一个全面的改进。正则表达式可以做到这一点,并将其与“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));
    

    另外请注意,只要关键字不包含任何正则表达式特殊字符(并且搜索字符串不包含管道符号),此操作就有效。但是,特殊字符可以用转义序列来克服,搜索字符串不必像我所做的那样连接起来。

    推荐文章