Можно ли разработать более стабильную структуру данных, чем .NET Dictionary? - PullRequest
1 голос
/ 15 марта 2012

Внутренняя структура и процесс .NET Dictionary<TKey,TValue> - это высокооптимизированный дизайн, о котором говорил Саймон Купер в этом замечательном блоге .

В документах MSDN указано, что Add(TKey,TValue) - это O (1) - если только количество элементов в Словаре не соответствует емкости, то для этого необходимо сначала выполнить операцию динамического изменения размера, в результате чего в этих точках выполняется Add () O (n).

По мере увеличения словаря операции изменения размера становятся все более редкими, и поэтому можно сказать, что при усреднении по большому n Add () приближается к O (1).

Об этом свидетельствует Купер в этом графике общего прошедшего времени для n / 2 операций добавления как функции от n.

Тем не менее, средний худший случай производительности Add () равен O (n).

Мой вопрос: возможно ли спроектировать более стабильную структуру данных, чем словарь .NET?

В частности, я хочу, чтобы средний наихудший случай производительность операций добавления, удаления и извлечения всех составляла O (1).

Обратите внимание, что постоянство характеристик («большой O») является единственным релевантным критерием проектирования. Использование памяти и абсолютная производительность (включая степень кластеризации и производительность кэша) не соответствуют критериям проектирования.

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

1 Ответ

3 голосов
/ 15 марта 2012

Вы просто пытались создать словарь с достаточно большим размером?

Общий O (1) в основном массив.Доступ по индексу.Или иерархические массивы (4-байтовый ключ, массив, указывающий на массив, указывающий на массив, указывающий на массив в значительной степени, для экономии места).

Все остальное - нет, извините.

Множество высокопроизводительных вещейиспользует предварительно выделенные массивы.

...