2017-02-25 10 views
0

に含まれている場合、私は次の文字列があります。チェック単語の一部が例のために事前に定義された配列

"Federal INSURANCE Mortgage" 

を、私は、この文字列内の任意の単語は、次の配列中に存在しているかどうかを確認したいです:

BAD_WORDS = %w{LLC CORPORATION INSURANCE COMPANY GEICO} 

この例では、保険が存在します。だから真実を返すべきだ。これは私がやったことです:

これはRubyでこの問題を解決する最も熟練した方法ですか?

答えて

1

あなたの方法と答え(これは今削除されています)は入力をループし、実行時間O(n )を作る各入力単語の単語をループします。入力が大きく、単語がたくさんある場合は、遅くなる可能性があります。

ルビー配列の交差法は、カバーの下にハッシュを使用するため、O(n)で同じジョブを実行できます。 Computing set intersection in linear time?

+0

更新+1​​ました:

("Federal INSURANCE Mortgage".split & BAD_WORDS).any? 

は、ここを参照してくださいまたは正規表現のソリューションで行きます。それはO(n)でなければならないと思います。 –

2

これは正規表現で行わ最高であり、このタスクのために1を組み立てることRegexp.unionと簡単です:

BAD_WORDS = %w{LLC CORPORATION INSURANCE COMPANY GEICO} 
BAD_WORDS_RX = Regexp.union(*BAD_WORDS) 

"Federal INSURANCE Mortgage".match(BAD_WORDS_RX) 
# => #<MatchData "INSURANCE"> 

は今、これはまた、部分的なワードは望ましくないかもしれない試合、が、あなたの中の単語を行います例はすべて非常にユニークです。

あなたのアプローチでは、単語を繰り返し処理し、さらに悪い単語の配列を繰り返し処理します。これはN * Mの複雑さです。つまり、幾何学的に遅いです。あなたの弦が長くなるか、または悪いリストが大きくなると、痛いほど高価になります。

正規表現は作成後は非常に低コストで、作成コストは名目上です。

オリジナルの小さな改善点は、配列の代わりにSetを使用することです。これらのルックアップ時間は一定です。

+0

私が正しいの両方の答えをマークできなかったので、私はあなたがあまりにも – Donato

関連する問題