改进O(n ^ 2)算法

时间:2017-06-14 10:55:29

标签: c# arrays algorithm linq

我有以下代码:

var keywordItems = adwordsService
  .ParseReport(report)
  .Where(e => e.Keyword.IndexOf('+') == -1);

var keywordTranslations = keywordTranslationService
  .GetKeywordTranslationsByClient(id);

model.KeywordItems = keywordItems
    .Where(e =>
    {
        int lastUnderscore = e.CampaignName.LastIndexOf('_');
        var identifer = e.CampaignName.Substring(lastUnderscore + 1);

        var translation = keywordTranslations
          .FirstOrDefault(t => t.translation == e.Keyword && 
                               t.LocalCombination_id == identifer);

        return translation == null;
    })
    .OrderBy(e => e.Keyword);

它接收一个数组,然后根据它们之前是否已经被看到过滤每个元素。

然而,由于有很多新元素,所以运行速度非常慢,所以我希望如果有人可以指出我在这种情况下使用的最佳算法的正确方向。

2 个答案:

答案 0 :(得分:2)

简单连接将完成这项工作 - 它使用hashset进行集合之间的匹配,从而为搜索操作提供O(1):

from k in keywordItems
let identifer = k.CampaignName.Substring(k.CampaignName.LastIndexOf('_') + 1)
join t in keywordTranslations on
    new { k.Keyword, Id = identifer } equals
    new { Keyword = t.translation, Id = t.LocalCombination_id } into g
where !g.Any()
orderby k.Keyword
select k

要进一步提高性能,您可以将identifier提取直接移至密钥创建。因此,您将省略引入新的范围变量。

答案 1 :(得分:2)

我建议使用哈希,例如 You said: {<sil>, 0.999, [1060:2170]} You said: {known, 0.999, [2180:2660]} You said: i am a java student 。假设HashSet<T>以及Dictionary<T>属于translation类型:

LocalCombination_id