【问题标题】:Dictionary Lookup (O(1)) vs Linq whereDictionary Lookup (O(1)) vs Linq where
【发布时间】:2010-03-16 16:31:13
【问题描述】:

什么更快,我应该牺牲 Linq 标准来实现速度(假设字典查找确实更快)?所以让我详细说明:

我有以下几点:

List<Product> products = GetProductList();

我需要根据某些属性搜索产品,例如序列号。我可以先创建一个字典,然后按如下方式填充它:

Dictionary<string, Product> dict = new Dictionary<string, Product>();
foreach(Product p in products)
{
    dict.Add(p.serial, p);
}

当需要查找产品时,利用字典查找提供的 O(1):

string some_serial = ...;
try { Product p = dict[some_serial]; } catch(KeyNotFoundException) { }

或者,使用 Linq:

Product p = products.Where(p => p.serial.Equals(some_serial)).FirstOrDefault();

Dict 方法的缺点当然是这需要更多的内存空间、更多的代码要编写、不那么优雅等(尽管大部分都是有争议的)。假设这是非因素。我应该采取第一种方法吗?

最后,我想确认一下上述 Linq 方法的复杂性是否确实为 O(n),我看不出它还有什么比这更好的。

【问题讨论】:

    标签: linq dictionary complexity-theory time-complexity


    【解决方案1】:

    假设你从一个对象的枚举开始,并且只做一次......

    使用Where 方法比添加到Dictionary&lt;TKey,TValue&gt; 然后再查找它更快。原因是字典方法不是 O(1)。在这种情况下,您将项目添加到字典中,然后进行查找。添加部分是 O(N),它与 ​​Where 方法一样昂贵,但有额外的内存开销。

    另一个需要注意的小问题是Dictionary&lt;TKey,TValue&gt; 并不是真正的 O(1)。相反,它接近 O(1),但在某些情况下可能会降低性能(例如很多冲突的键)。

    【讨论】:

    • 是的,我忘了考虑添加到字典的开销。谢谢。
    • 但是如果我多次使用字典(即 100 次)而不是一次呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多