ブックマークのリストがあります。各ブックマークにはキーワードのリストがあります (HashSet として保存されます)。また、考えられるすべてのキーワード ("universe") のセットもあります。
ブックマークに最も多く表示されるキーワードを見つけたい。
合計 698,539 個のキーワード、187,358 個の固有のキーワードを持つ 1356 個のブックマークがあります。
宇宙のすべてのキーワードを反復処理し、それが表示されるブックマークの数を数えると、254,057,448 回のチェックを行っていることになります。私のマシンでは、これに 35 秒かかります。
アルゴリズムは非常に単純です。
var biggest = universe.MaxBy(kw => bookmarks.Count(bm => bm.Keywords.Contains(kw)));
Jon Skeet の MaxByを使用します。
これを大幅に高速化できるかどうかはわかりませんが、何かできることはありますか? おそらく何とかそれを並列化しますか?
dtb のソリューションは、宇宙の構築と最大の要素の発見の両方に 200 ミリ秒未満かかります。とても簡単。
var freq = new FreqDict();
foreach(var bm in bookmarks) {
freq.Add(bm.Keywords);
}
var biggest2 = freq.MaxBy(kvp => kvp.Value);
FreqDict
の上に構築した小さなクラスですDictionary<string,int>
。