Что их вообще отличает?

Согласно Википедии, словарь является синонимом ассоциативного массива.

  • абстрактный тип данных,
  • коллекция,
  • содержит пары ключ-значение
  • в котором каждый ключ может появиться один раз.

Согласно Википедии, хеш-таблица - это распространенный способ реализации словаря. Другая реализация - это двоичное дерево поиска.

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

dictionary     :: hash table     :: binary search tree
human          :: male           :: female
pasta          :: radiatori      :: spaghetti

Что сбивает с толку, так это то, что документация иногда требует в качестве аргумента словаря. В документации по PowerShell (как один из многих примеров) говорится:

Введите хеш-таблицу или словарь.

Означает ли это просто «ввести хеш-таблицу или любую другую реализацию словаря», или они на самом деле запрашивают конкретный тип, известный как словарь? Если последнее, то что отличает хеш-таблицу конкретных типов от словаря конкретных типов?

1
Shaun Luttin 13 Мар 2015 в 23:29

2 ответа

Лучший ответ

Можно утверждать, что словарь является абстрактным типом данных (ADT), а хеш-таблица , как вы сами подразумевали, цитируя свой sources - это конкретная реализация словаря, аналогичная бинарному дереву поиска. Словарь просто позволяет связывать ключи со значениями, это интерфейс . Интерфейс не определяет реализацию. Многие классы могут реализовывать один и тот же интерфейс принципиально по-разному. На машине, где стоимость доступа к памяти и сравнения данных ничтожно мала по сравнению со стоимостью выполнения данной хеш-функции, словарь, реализованный посредством простой линейной итерации по ключам, может быть лучшим вариантом, чем хеш-таблица. Специально для словарей меньшего размера.

Интерфейс словаря, или ADT, представляет собой набор сигнатур функций - получение значения с заданным ключом, перечисление ключей и / или значений, получение количества ключей / значений. Затем создаются классы, реализующие интерфейс, предоставляя фактические функции, соответствующие этим сигнатурам.

Powershell, похоже, (в основном) согласен с этой цепочкой рассуждений - естественно, что хеш-таблицы, являющиеся реальными объектами, являются (не абстрактным) классом . В частности, System.Collections.HashTable класс. Этот класс объявляет, что реализует систему . Collections.IDictionary интерфейс .

Однако что интересно, Powershell действительно имеет конкретный «общий» словарь class - System.Collections.Generic.Dictionary<TKey,TValue>. Похоже, что для этого словарного класса нет никаких намека на механизм. Существуют и другие похожие «общие» классы, которые различаются между собой на основе таких факторов, как разрешено ли изменение словаря (во время выполнения), является ли словарь «отсортированным» и т. Д. Но они тоже не намекают на то, как, например, поиск значения фактически выполняется, чтобы назвать одну вещь.

Вопрос о том, удовлетворит ли какая-либо из этих более «общих» реализаций словарей в некотором роде пуриста, остается спорным, но опять же можно подумать, что System.Collections.Generic.Dictionary<TKey, TValue> создан для случаев, когда разработчик приложения не хочет или не должен беспокоиться о том, как выглядят их словари. реализовано. Этот класс фактически является «псевдонимом типа» для того или иного типа словарного класса, такого как хеш-таблица, двоичное дерево или что-то еще, не раскрывая, какой именно. Я не уверен, почему разработчики .NET просто не оставили бы вместо этого псевдоним с using Dictionary = System.Collections.HashTable.

1
amn 11 Май 2020 в 18:05

Я бы посоветовал не слишком зацикливаться на словарных определениях терминов.

Если мы сосредоточимся на классах, [System.Collections.Generic.Dictionary] и [System.Collections.Hashtable] должно помочь.

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

Когда они говорят, что требуется словарь, они, вероятно, имеют в виду, что он принимает [IDictionary].

Вы также можете видеть, что эти классы реализованы немного иначе < / а>. [Dictionary] создан по шаблону для ключа и значения, и это не типично для PowerShell, и, вероятно, поэтому вы не видите его так часто.

2
briantist 13 Мар 2015 в 20:44