2017-12-28 15 views
1

私が必要とするのは、単語を含む配列2の配列1からフレーズを探すことです。 Arrayには[Margaret is a girl]が含まれています。 "愛"; "ポテト"; "Swim"]、もう一つは配列に吐き出される単語のランダムなテキストです。フレーズ(単語のシーケンス)と単語だけを効率的にチェックする方法は? 昔ながらのやり方は、タイミング問題になると思いますので。単語の配列の特定のフレーズを効率的に検索するには?

+5

何を試してみましたか、具体的には、あなたは何と苦労していますか? –

+0

私はこの問題をFORループを使って並べ替えようとしましたが、同じ配列を何度も使っています...そして、それを改善して、必要な時間を短縮したい –

+0

あなたの問題は簡単ではなく、最適なパフォーマンスが必要です。大きな文字列を複数の文字列で検索することは、[prefix trees](https://en.wikipedia.org/wiki/Trie)(aka * tries *)を使用して効率的に実装できます。 –

答えて

2

もし__.exists又は__.forall機能を使用する場合、それらがあれば(非)マッチング結果はループほど効率的周りされる、見られるように短絡されます

let arr1 = [| "Margaret is a girl"; "Loves";"Potato"; "Swim" |] 
let arr2 = [| "Margaret"; "is"; "a"; "girl" |] 

let ``can be built from`` words phrase = 
    phrase 
    |> String.split ' ' 
    |> Array.forall (fun word -> words |> Array.contains word) 

let buildablePhrases = arr1 |> Array.filter (``can be built from`` arr2) 

配列の場合巨大で上記のコードはまだ遅すぎるので、重複の削除、頻繁な検索のキャッシュなど、最適化の導入を開始する必要があります。最適化の対象は、扱うデータによって異なります。

+0

ありがとう、私はあなたの考えを私のコードに実装しようとします! –

関連する問題