我有一个书签列表。每个书签都有一个关键字列表(存储为 HashSet)。我还有一组所有可能的关键字(“宇宙”)。
我想找到出现在最多书签中的关键字。
我有 1356 个书签,总共有 698,539 个关键字,有 187,358 个唯一关键字。
如果我遍历宇宙中的每个关键字并计算它出现的书签数量,我将进行 254,057,448 次检查。这在我的机器上需要 35 秒。
该算法非常简单:
var biggest = universe.MaxBy(kw => bookmarks.Count(bm => bm.Keywords.Contains(kw)));
我不确定是否可以加快速度,但有什么我能做的吗?也许以某种方式并行化它?
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>
.