Swift: почему требуется, чтобы тип ключа в словаре был типа Hashable

Если я хочу создать Dictionary<Key:Value>(), он необходим для объекта типа Key для протокола Hashable. Почему так, как реализованы словари?

Я имею в виду, что я бы понял, что если Key просто должен соответствовать протоколу типа Equatable, поскольку программе придется искать соответствующее значение, однако дополнительный var hashValue: Int, который поставляется вместе с Hashable, немного сбивает с толку.

Подсказка: словарь - это хеш-карта.

rmaddy 01.05.2018 16:27

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

BallpointBen 01.05.2018 16:41

@rmaddy имеет больше смысла :-) Почему они называют это словарем? Следует называть это HashMap, например Java

rahulg 01.05.2018 16:43

@BallpointBen Словарь (общая структура вычислительных данных, также известная как ассоциативный массив) не требует использования хэша для поиска значения, это более общий характер. Словарь - это набор пар ключ-значение, который можно использовать для хранения и поиска значений, просто имея соответствующий ключ. Хеш-часть - это оптимизация для ускорения поиска за счет реализации словаря в виде хеш-карты. С таким же успехом это может быть структура типа дерева поиска.

user887210 01.05.2018 16:50

И «структура типа дерева поиска» потребовала бы, чтобы элементы были Comparable вместо Hashable. У каждого есть свои компромиссы. OP: Если вы ищете ассоциативный тип данных, который использует ключи Equatable, см. DictionaryLiteral, который по сути является просто оболочкой для Array<(Key: Equatable, Value)>.

Alexander 01.05.2018 17:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
634
1

Ответы 1

Хэшируемые ключи делают словарные вставки и поиск более эффективными, особенно для больших словарей.

Если ключ не является хешируемым, чтобы найти конкретный ключ, вы должны (в худшем случае) прочитать и сравнить на равенство все ключи в словаре.

Хэшируемые ключи естественным образом делятся на сегменты по их хеш-значениям, и чтобы найти конкретный ключ, вы вычисляете его хэш для определения сегмента, в котором он находится, тогда вам нужно только сравнить ключи равенства, которые принадлежат одному и тому же сегменту. Если хэш-функция выбрана правильно и количество элементов в словаре меньше максимального значения Int, у вас есть довольно хороший шанс иметь только один ключ на ведро, что делает поиск столь же эффективным, как O (1).

Больше информации в этот связанный вопрос.

Другие вопросы по теме