Поиск по словарю (O (1)) по сравнению с Linq, где

Что быстрее, и я должен пожертвовать стандартом 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), и я не вижу, как это может быть лучше, чем это.

6
задан Kevin Le - Khnle 16 March 2010 в 16:31
поделиться

1 ответ

Предполагая, что вы начинаете с перечисления объектов и делаете это только один раз ...

Будет быстрее использовать метод Where, чем добавлять в Dictionary и затем искать его обратно. Причина в том, что метод словаря не O(1). В этом сценарии вы добавляете элементы в словарь, а затем просматриваете его. Часть добавления является O(N), что так же дорого, как и метод Where с дополнительными накладными расходами памяти.

Еще один незначительный момент, о котором следует знать: Dictionary не является действительно O(1). Вместо этого он приближается к O(1), но при определенных обстоятельствах (например, при большом количестве несовпадающих ключей) может ухудшиться до меньшей производительности.

8
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: