Вам нужно немного покопаться, чтобы увидеть, как словарь реализован в C # - он не так очевиден, как HashMap (хэш-таблица) или TreeMap (отсортированное дерево) (или ConcurrentSkipListMap - список пропуска ).
Если вы покопаетесь в разделе «Замечания»:
Универсальный класс Dictionary обеспечивает сопоставление набора ключей с набором значений. Каждое дополнение к словарю состоит из значения и связанного с ним ключа. Извлечение значения с использованием его ключа выполняется очень быстро, близко к O (1), поскольку класс Dictionary реализован в виде хеш-таблицы.
И там у нас это есть. Это хеш-таблица . Обратите внимание, что я связал там статью из Википедии - ее довольно хорошо читают. Вы можете прочитать раздел о разрешении коллизий. Можно получить патологический набор данных, в котором поиск переходит в O (N) (например, все, что вы вставляете, попадает в одно и то же хеш-значение или индекс в хеш-таблице, и у вас остается линейное зондирование ).
В то время как Словарь является решением общего назначения, вы не должны передавать конкретные типы (такие как Словарь) - вы должны передавать интерфейсы. В этом случае этот интерфейс IDictionary
( документы ). Для этого вы вполне способны написать собственную реализацию словаря, которая оптимально подходит для ваших данных.
Что касается эффективности различных поиска / содержит?
- Ходить по несортированному списку: O (N)
- Двоичный поиск отсортированного массива: O (log N)
- Сортированное дерево: O (log N)
- Хеш-таблица: O (1)
Для большинства людей хеш-таблица - это то, что они хотят.
Вы можете обнаружить, что вместо этого вам нужен SortedDictionary :
SortedDictionary<TKey, TValue>
Общий класс представляет собой бинарное дерево поиска с O (журнал п) извлечения, где п число элементов в словаре. В этом отношении он похож на SortedList<TKey, TValue>
общий класс. Два класса имеют похожие объектные модели, и оба имеют O (log n) извлечения.
Хотя, опять же, если структура данных не идеально подходит для ваших данных, вам предоставляются инструменты (интерфейсы), чтобы иметь возможность написать структуру, которая лучше всего подходит для ваших данных.
Сам словарь является абстрактным типом данных . Вы даете мне словарь, и я знаю, что я могу с ним сделать, и все инструменты там для меня, чтобы использовать его по природе, как словарь. Если бы вы дали мне ArrayList, я бы написал свой собственный код для поиска, вставки или удаления элементов из списка. Это напрасно тратит мое время, а также означает, что вероятность ошибки увеличивается, поскольку я копирую код снова и снова с места на место.
Data Structures
эта ссылка на вики может быть вам более