Вам доведеться трохи копати, щоб побачити, як Словник реалізований у C # - Це не так очевидно, як HashMap (хеш-таблиця) або TreeMap (відсортоване дерево) (або ConcurrentSkipListMap - пропускний список ).
Якщо ви перекопаєтесь до розділу "Зауваження":
Загальний клас словника забезпечує відображення від набору ключів до набору значень. Кожне доповнення до словника складається з значення та пов'язаного з ним ключа. Отримання значення за допомогою його ключа дуже швидко, близьке до O (1), тому що клас Словник реалізований як хеш-таблиця.
І там ми його маємо. Це хеш-таблиця . Зауважте, що я пов’язав там статтю Вікіпедії - її досить добре читати. Ви можете прочитати розділ щодо роздільної здатності. Можна отримати патологічний набір даних, коли пошук переходить до O (N) (наприклад, все, що ви вставляєте, чомусь потрапляє до того самого хеш-значення або індексу в хеш-таблиці, і вам залишається лінійне зондування ).
Хоча Словник є загальним рішенням, ви не повинні обходити конкретні типи (наприклад, словник) - ви повинні проходити навколо інтерфейсів. У цьому випадку цей інтерфейс є IDictionary
( docs ). Для цього ви цілком здатні написати власну реалізацію словника, яка робить все оптимально для ваших даних.
Щодо ефективності різних пошуку / містить?
- Прогулянка по несортованому списку: O (N)
- Двійковий пошук відсортованого масиву: O (журнал N)
- Сортоване дерево: O (журнал N)
- Таблиця хешу: O (1)
Для більшості людей хеш-таблиця - це те, чого вони хочуть.
Ви можете виявити, що SortedDictionary - це те, що ви хочете замість цього:
SortedDictionary<TKey, TValue>
Загальний клас являє собою бінарне дерево пошуку з O (журнал п) вилучення, де п число елементів в словнику. У цьому відношенні він подібний до SortedList<TKey, TValue>
родового класу. Два класи мають подібні об'єктні моделі, і обидва мають пошук O (log n).
Хоча, знову ж таки, якщо структура даних не є тією, яка ідеально працює з вашими даними, вам надаються інструменти (інтерфейси), щоб можна було записати той, який найкраще підходить для ваших даних.
Сам словник - це абстрактний тип даних . Ви даєте мені Словник, і я знаю, що я можу зробити з ним, і всі інструменти там для мене, щоб використовувати, оскільки він є Словником. Якби ви дали мені ArrayList, я міг би записати власний код для пошуку, вставки чи видалення елементів зі списку. Це витрачає мій час, а також означає, що більша ймовірність помилки, оскільки я копіюю код знову і знову з місця на місце.
Data Structures
посилання на вікі, можливо, вам буде