2010-11-18 12 views
3

私は約50個のキーワードと約50000個の文字列のリストを持っています。少なくとも1つのキーワードが含まれている場合は、すべての文字列をチェックします。一致したキーワードや一致するキーワードの数には関心がありません。私はできるだけ早く "真の"または "偽の"バックだけを望んでいます。文字列に指定された配列に文字列が含まれているかどうかを調べるための高速アルゴリズム

だから、私ははるかに私の現在の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" }); 

答えて

1

本質的に今日のあなたの他の質問と同じではありませんEfficient algorithm for finding all keywords in a textマッチが見つかったら一度戻るように変更されていますか?

+0

私は2つの別々の懸念事項があります:1つは、指定されたキーワードのリスト内のキーワードを含むすべての文字列を見つけることです。もう1つは、キーワードリストこれらのリストは異なっており、目的が異なります。 – VVS

+0

OKですが、この解決策は両方の場所で同じ威力を発揮します(この場合、1つの一致が見つかると復帰するように変更されています)。 –

+0

おっと、私は最後まで読んでいたはずです。私はあなたが正しいと思う、私は単一のキーワードが見つかった後に戻るアルゴリズムを変更することができます。私は非常に高速な解決策になるはずです。 – VVS

0

Knuth-Morris-Pratt algorithmを実装できます。

+0

これは、1つの単語を検索します。セットを検索するためのより良いアルゴリズムがあります。ウィキペディアhttp://en.wikipedia.org/wiki/String_searching_algorithmを参照してください。 #Algorithms_using_finite_set_of_patterns –

0

簡単な分析では、キーワードを繰り返し検索していることがわかります。すべてのキーワードに対して1回のパスで検索できる場合は、アルゴリズムの全体的な改善が必要です。 Regexの式はそれを行い、 "Compiled"オプションと組み合わせることができます。すべてのキーワードに対して文字列を1回だけ渡すため、パフォーマンスが向上するはずです。しかし、それはあなたがいくつかのキーワードを持っている場合にのみあなたに恩恵を受けるでしょう。ここでは手伝ってくれる素早いアイデアがありますが、私はアルゴリズムに対して実際に性能をテストしていません。

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

またただし、特殊文字をエスケープシーケンスを克服することができます。これは、限り、あなたのキーワードは任意の正規表現の特殊文字が含まれていない(と検索文字列がパイプ記号が含まれていないとして働いて、注意してください、と

関連する問題