3

フックワードとは、最初または最後に1文字追加して新しい単語を作ることができる単語です。

かなり大きな単語リスト (約 170k) があり、5 つのランダムなフック ワードを選択したいと考えています。問題は、私が使用している方法が非常に遅いことです。下記参照:

Random rnd = new Random();
var hookBases = (from aw in allWords  //allWords is a List<string>
                from aw2 in allWords
                where aw2.Contains(aw) 
                      && aw2.Length == aw.Length + 1 
                      && aw[0] == 'c'
                select aw).OrderBy(t => rnd.Next()).Take(5);

何かにアクセスしようとするhookBaseと、あきらめて殺す前に数分間スピンします。

私がこれをやろうとしている方法に明らかな間違いがある人はいますか? より効率的な方法に関する提案はありますか?

4

2 に答える 2

6

まず、効率的なルックアップのために、 allWords はHashSet<string>ではなく である必要があります。List<string>

それが完了したら、ハッシュセットを繰り返し処理し、最初または最後の文字を削除すると新しい有効な単語が得られるかどうかを確認します。それはあなたのフックワードです。

HashSet<string> result = new HashSet<string>();
foreach (string word in allWords) {
    string candidate = word.Substring(0, word.Length - 1);
    if (allWords.Contains(candidate)) { result.Add(candidate); }
    candidate = word.Substring(1, word.Length - 1);
    if (allWords.Contains(candidate)) { result.Add(candidate); }
}

LINQ でこれを行う場合:

List<string> hookWords = allWords
    .Select(word => word.Substring(0, word.Length - 1))
    .Concat(allWords.Select(word => word.Substring(1, word.Length - 1)))
    .Distinct()
    .Where(candidate => allWords.Contains(candidate))
    .ToList();

オンラインでの動作を確認してください: ideone

于 2012-05-10T06:48:54.813 に答える
-1

私は最近似たようなことをしました。linqを試して、正規表現を含む.netアセンブリをddbbとストアドプロシージャに格納しました。最も効率的な方法は、ストアドプロシージャを使用することであることがわかりました。トランザクションエンジンは、この種の操作のためにMicrosoftによって高度に最適化されています。

よろしくお願いします

于 2012-05-10T07:01:51.310 に答える