【问题标题】:Optimization build dictionary for list of list优化列表列表的构建字典
【发布时间】:2013-10-21 03:28:57
【问题描述】:

我有一个包含类似 (listElement) 的元素的列表:{e1,e2,e3,e4,e5,e6,e7}

它们在列表列表(listOfList)中是这样的组: { {e1,e2,e3,e4}, {e1,e2,e3}, {e2,e3,e4}, {e1,e2}, {e2,e3}, {e3,e4}, {e5}, { e6,e7} }

我想要的是将列表放在字典中>>(dict)这样:

  • 键,(值)
  • e1, ({e1,e2,e3,e4},{e1,e2,e3},{e1,e2})
  • e2, ({e1,e2,e3,e4},{e1,e2,e3},{e2,e3,e4},{e1,e2},{e2,e3})
  • e3, ({e1,e2,e3,e4},{e1,e2,e3},{e2,e3,e4},{e2,e3},{e3,e4})
  • e4, (({e1,e2,e3,e4},{e2,e3,e4},{e3,e4})
  • e5, ({e5}) = e6, ({e6,e7})

现在我有这样的代码:

foreach (element in listElement){
   var elementListOfList = listOfList,where(e=>e.countain(f));
   dict[f.id] = elementListOfList;
}

问题是字典的构建真的太长了,因为我有大约 100 万个元素,但在字典中。

我知道使用 a for over a for each 可能是最好的,但我确信它可以做其他事情。

我的问题是有人有一个想法来优化字典的创建,和/或一些可以帮助我优化代码的网站或书籍?

【问题讨论】:

标签: c# performance linq list dictionary


【解决方案1】:

嗯,你不能比迭代所有列表中的所有元素更快,因为你无法预测哪个列表包含哪些项目。

但是你可以稍微优化一下你的代码:

假设您有列表列表:

List<List<E>> listOfList = new List<List<E>>()
{
    new List<E>() { e1, e2, e3, e4 },
    new List<E>() { e1, e2, e3 },
    ... 
};

然后,你可以制作一本字典:

Dictionary<E, List<List<E>>> dic = new Dictionary<E, List<List<E>>>();

你来了:

foreach (List<E> list in listOfList)
{
    foreach (E item in list)
    {
        List<List<E>> itemList;

        if (!dic.TryGetValue(item, out itemList))
        {
            dic[item] = itemList = new List<List<E>>();
        }

        itemList.Add(list);
    }
}

【讨论】:

    【解决方案2】:

    对于 listElement 的每个项目,您都在迭代 ListOfList 中的所有列表。 (包含通常会在到达列表末尾之前停止,但这会给您带来 O(k*n) 时间复杂度,其中 k 是 listElement 的长度,n 是 ListOfLists 中所有列表的所有元素的数量。

    您的循环大致相当于:

    foreach (var element in listElement)
        foreach (var list in ListOfList)
            foreach (var elem in list)
                if (element == elem)
                {
                    dict[elem].Add(list);
                    break;
                }
    

    您可以通过只迭代 ListOfLists 列表的元素一次来改进它:

    var dict = listElement.ToDictionary(e => e, e => new List<List<YourType>>());
    foreach (var list in ListOfList)
        foreach (var elem in list)
            dict[elem].Add(list);
    

    这为您提供 O(k+n) 时间复杂度(字典查找和 List.Add 具有摊销 O(1) 复杂度)。对于这个问题,您无法获得比这更好的复杂性。

    【讨论】:

    • @AgentFire 不,不是。如果几乎相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2021-11-10
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多