在列表和字典中搜索的复杂性

时间:2015-07-24 11:22:29

标签: c# list dictionary

假设我有一个班级:

class C
{
    public int uniqueField;
    public int otherField;
}

这是实际问题的非常简化版本。我想存储此类的多个实例,其中“uniqueField”对于每个实例应该是唯一的。

在这种情况下哪个更好?

a)以uniqueField为键的字典

Dictionary<int, C> d;

或b)列表?

List<C> l;

在第一种情况(a)中,相同的数据将被存储两次(作为键和作为类实例的字段)。但问题是:在字典中查找元素比在列表中更快吗?或者同样快?

A)

d[searchedUniqueField]

b)中

l.Find(x=>x.uniqueField==searchedUniqueField);

3 个答案:

答案 0 :(得分:5)

假设您拥有相当多的实例,那么在字典中查找该项目可能会更快 。基本上Dictionary<,>hash table,除了由于碰撞而进行O(1)查找。

现在,如果集合非常小,那么查找哈希码,计算正确的存储桶然后查看该存储桶以匹配哈希码,然后执行密钥相等性检查的额外开销可能需要更长的时间,而不仅仅是检查每个元素在列表中。

如果可能有很多实例,但可能不,我通常会选择字典方法。首先,它表达了您实际尝试实现的目标:通过密钥访问元素的简单方法。小集合的开销不太可能非常显着,除非你有比小集合更小的集合。

答案 1 :(得分:1)

当查找次数大大超过插入次数时使用Dictionary。当你总是少于四个项目时,可以使用List。

参考 - http://www.dotnetperls.com/dictionary-time

答案 2 :(得分:0)

如果您想确保您的客户端不会创建密钥的重复,您可能希望您的类负责创建唯一密钥。因此,一旦唯一密钥生成是类的责任,字典或列表就是客户决定。