【发布时间】:2017-09-21 21:13:39
【问题描述】:
我正在尝试实现一个工具,该工具可以根据单词的引理对某些字符串进行分组。在初始化期间,我为每个可能的组创建一个字典,其中包含将分组到该键中的单词列表。这是我目前所拥有的:
public Dictionary<string, HashSet<string>> Sets { get; set; }
private void Initialize(IStemmer stemmer)
{
// Stemming of keywords and groups
var keywordStems = new Dictionary<string, List<string>>();
var groupStems = new Dictionary<string, List<string>>();
foreach (string keyword in Keywords)
{
keywordStems.Add(keyword, CreateLemmas(keyword, stemmer));
foreach (string subset in CreateSubsets(keyword))
{
if (subset.Length > 1 && !groupStems.ContainsKey(subset))
{
groupStems.Add(subset, CreateLemmas(subset, stemmer));
}
}
}
// Initialize all viable sets
// This is the slow part
foreach (string gr in groupStems.Keys)
{
var grStems = groupStems[gr];
var grKeywords = new HashSet<string>((from kw in Keywords
where grStems.All(keywordStems[kw].Contains)
select kw));
if (grKeywords.Count >= Settings.MinCount)
{
Sets.Add(gr, grKeywords);
}
}
}
有什么办法可以加快这种方法的瓶颈?
【问题讨论】:
-
首先确定这是否是瓶颈。因此,您应该测量这段代码真正需要多长时间。你真的想把精力投入到只需要几毫秒的事情上吗?
-
这确实是个瓶颈。对于 5k+ 字符串,这个特定部分占用了 90% 的运行时间。
-
代码需要多长时间?你想用多长时间?
-
您显然有一个关键字列表或一组关键字。为什么不预先计算数据,将其保存在数据库中并加载它?丢失的关键字可以在错过时添加并保存以备将来使用...
-
3500 个字符串大约需要 24 秒,这部分代码负责其中的 21 个。通过将 List 更改为 HashSet,我设法抓取了大约 7 秒。谢谢!
标签: c# algorithm loops optimization