В чем разница между картой и словарем? - PullRequest
154 голосов
/ 21 мая 2010

Я знаю, что карта - это структура данных, которая сопоставляет ключи со значениями. Разве словарь не такой же? В чем разница между картой и словарем 1 ?


1. Я не спрашиваю о том, как они определены в языке X или Y (что, как правило, это то, о чем обычно спрашивают люди о SO), я хочу знать, в чем их отличие в теории.

Ответы [ 11 ]

220 голосов
/ 21 мая 2010

Два термина для одного и того же:

  • "Карта" используется Java, C ++
  • "Словарь" используется .Net, Python
  • «Ассоциативный массив» используется PHP

«Карта» - правильный математический термин, но его избегают, поскольку он имеет отдельное значение в функциональном программировании .

В некоторых языках используются другие термины («Объект» в Javascript, «Хэш» в Ruby, «Таблица» в Lua) , но все они имеют разные значения в программировании, поэтому я бы избегал их.

См. здесь для получения дополнительной информации.

17 голосов
/ 21 мая 2010

Один - более старый термин для другого. Обычно термин «словарь» использовался до того, как вступил в силу математический термин «карта». Кроме того, словари обычно имеют ключевой тип строки, но это не на 100% верно везде.

5 голосов
/ 04 ноября 2014

Мои 2 цента.

Словарь - это абстрактный класс в Java, тогда как Map - это интерфейс.Поскольку Java не поддерживает множественное наследование, если класс расширяет словарь, он не может расширять любой другой класс.

Поэтому появился интерфейс Map.

Класс словаря устарел, и использование Map является предпочтительным.

3 голосов
/ 21 мая 2010

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

Существует древовидный словарь под названием Trie .

В Лиспе это может выглядеть так:

(a (n (d t)) n d )

В котором заключены слова:

  • a
  • и
  • муравей
  • и
  • объявления

Обход сверху до листа дает слово.

2 голосов
/ 13 июля 2016

Не совсем то же самое. Карты являются подмножеством словаря. Словарь здесь определен как имеющий функции вставки, удаления и поиска. Карта, используемая в Java (согласно this ) - это словарь с требованием, чтобы сопоставление ключей со значениями строго отображалось как функция «один к одному». Словарь может иметь более одной ключевой карты на одно значение или одну ключевую карту на несколько значений (например, связывание в hasthtable), например, поиск в хештеге Twitter.

В качестве более "реального мира", пример поиска слова в словаре может дать нам несколько определений для того же слова, и когда мы находим запись, которая указывает нам на другую запись (см. Другое слово), количество слов для одного и того же списка определений. В реальном мире карты гораздо шире, что позволяет нам иметь места для имен или имен для координат, но также мы можем найти ближайшего соседа или другие атрибуты (популяции и т. Д.), Поэтому ИМХО может быть аргумент для большего расширения тип карты, возможно, имеет реализации на основе графа, но было бы лучше всегда предполагать только пару ключ-значение, тем более что ближайший сосед и другие атрибуты значения могут быть просто членами данных значения.

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

Помните, что сопровождающие Java не являются хранителями определений ADT и что решения Java предназначены специально для Java.

1 голос
/ 22 сентября 2015

так на чисто теоретическом уровне.

Словарь - это значение, которое можно использовать для поиска связанного значения. Карта - это Значение, которое предоставляет инструкции о том, как найти другие значения

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

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

1 голос
/ 21 мая 2010

Да, они одинаковы, вы можете добавить в ассоциацию «Ассоциативный массив».

с использованием Hashtable или Hash ofter относится к реализации.

1 голос
/ 21 мая 2010

Другие довольно распространенные термины для этого понятия: ассоциативный массив и хэш.

0 голосов
/ 17 мая 2019

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

Объясненная терминология

Оксфордский университет Словарь компьютерных наук списки:

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

  • Например, у нас есть набор элементов {A, B, C, D ...}, которые мы смогли вставить и могли начать удаление, и мы можем запросить "это C нет? ".

Понятие вычислительной науки о map хотя и основано на математическом лингвистическом термине mapping , который Оксфордский словарь определяет как:

отображение Операция, которая связывает каждый элемент данного набора (домена) с одним или несколькими элементами второго набора (диапазона).

  • Таким образом, структура данных map обеспечивает возможность перехода от элементов данного набора - известные как " keys " на карте к один или несколько элементов во втором наборе - известные как « value (s) ».
  • "... или более элементов во втором наборе" аспект может поддерживаться реализацией двумя различными способами:
    • Многие реализации карт обеспечивают уникальность ключей и позволяют каждому ключу быть связанным только с одним значением, но это значение может быть самой структурой данных, содержащей много значений более простого типа данных, например, {{1, {"one", "ichi"}, {2, {"two", "ni"}}} иллюстрируют значения, состоящие из пар строк.
    • Другие реализации карты допускают дублирование ключей, каждое сопоставление с одинаковыми или разными значениями - что функционально удовлетворяет случаю «ассоциирует ... каждый [ключевой] элемент ... с ... более [чем один] [элемент] значения» » , Например, {{1, "one"}, {1, "ichi"}, {2, "two"}, {2, "ni"}}.

Словарь и карта противопоставлены

Итак, используя строгую терминологию Comp Sci, приведенную выше, словарь - это только карта, если интерфейс поддерживает дополнительные операции, не требующиеся для каждого словаря:

  • возможность хранить элементы с различными ключами и значениями компонентами

  • возможность извлекать значения, заданные только ключом

Тривиальный поворот:

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

Однозначно общайтесь со своей аудиторией

⚠ Несмотря на все вышесказанное, если вы используете словарь в строгом понимании вычислительной техники, описанном выше, не ожидайте, что ваша аудитория пойдет за вами изначально, или вы будете впечатлены, когда вы будете делиться и защищать терминологию. Другие ответы на этот вопрос (и их комментарии) показывают, насколько вероятно, что «словарь» будет синонимом «карты» в опыте большинства программистов. Попробуйте выбрать терминологию, которая будет понятна более широко и однозначно: например,

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

Перекрестная ссылка на терминологию Comp Sci с конкретными реализациями

Стандартная библиотека C ++

  • карты: map, multimap, unordered_map, unordered_multimap
  • другие словари: set, multiset, unordered_set, unordered_multiset
  • примечание: с помощью итераторов или std::find вы можете стереть элемент и проверить членство в array, vector, list, deque и т. Д., Но интерфейсы контейнеров не поддерживают это напрямую, поскольку нахождение элемента невероятно неэффективно при O (N), в некоторых случаях вставка / стирание неэффективна, и поддержка этих операций подрывает намеренно ограниченный API, который подразумевает контейнер - например, deque s должен поддерживать только стирание / выдавливание спереди и сзади, а не с точки зрения некоторых клавиш. Необходимость выполнять больше работы в коде для организации поиска мягко побуждает программиста переключаться на структуру данных контейнера с более эффективным поиском.

... может позже добавить другие языки / не стесняйтесь редактировать в ...

0 голосов
/ 07 июня 2017

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

Обычно мы обрабатываем столкновения, используя Separate Chaining . Или Линейный зонд .

A Словарь позволяет связать несколько записей с одним и тем же ключом.

Когда на карте реализована отдельная цепочка, она имеет тенденцию напоминать словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...