В чем разница между картой и словарем?

199

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


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

пожрал Элизиум
источник
Отличный вопрос!
NoName

Ответы:

262

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

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

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

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

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

BlueRaja - Дэнни Пфлугхофт
источник
7
Разве у JAVA нет и карты, и словаря? Какие там различия?
vivek_jonam
36
@vivek_jonam: Dictionaryв Java устарел. Это абстрактный класс, используемый до создания Mapинтерфейса.
BlueRaja - Дэнни Пфлугхофт
7
Я знаю, что вопрос не зависит от языка, так что это правильный ответ, но я остановился здесь на поиске причины, по которой у Java было и то, и другое, поэтому этот комментарий был действительно идеальным для меня.
GrandOpener
1
«таблица» используется в lua.
Дедупликатор
1
он также несколько озадаченно называется «Объект» в JSON (по историческим причинам, связанным с JavaScript)
апрель
20

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

Эдвин Бак
источник
10

Мои 2 цента.

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

Поэтому интерфейс Map был представлен.

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

Nishit
источник
9

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

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

Словарь Оксфордского университета по информатике перечисляет:

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

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

Понятие Computing Science of map, хотя и основано на математическом лингвистическом отображении терминов , которое Оксфордский словарь определяет как:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тони Делрой
источник
3

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

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

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

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

Который заключает в себе слова:

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

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

Пол Натан
источник
4
Dictionaryв .Net неупорядочено.
BlueRaja - Дэнни Пфлюгофт
2
Словари какао также неупорядочены.
Кен
С ++ std::mapзаказан, его реализация не указана в стандарте, он std::unordered_mapбыл представлен в c ++ 11, он реализован через хеш
Харальд Шейрих
3
@HaraldScheirich - Хотя в стандарте C ++ конкретно не говорится «для реализации следует использовать красно-черное дерево std::map», попробуйте использовать что-нибудь еще. Дерево AVL не будет работать; это затраты на вставку не соответствуют стандарту. Хеш не сработает; хэш неупорядочен и, следовательно, не соответствует стандарту. Стандарт в значительной степени гласит: «Вы должны использовать красно-черное дерево для реализации std::map», не говоря об этом явно.
Дэвид Хаммен
+1. Хотя словари неупорядочены на многих платформах, слово обозначает порядок. Мне больше нравится термин карта.
Nawfal
2

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

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

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

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

user6585083
источник
1

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

Хэнк Гей
источник
1
Хэш не имеет к этому никакого отношения. Это метод быстрого определения, отличаются ли объекты. Вы думаете о hashmap, который использует hash для выполнения работы Map / Dictionary.
DJClayworth
5
@DJClayworth Нет, многие языки программирования на самом деле называют эти вещи хешами. Смотри Руби . Я не спроектировал это, и я бы не назвал это так, но не стреляйте в курьера.
Хэнк Гей
1

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

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

OscarRyz
источник
1

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

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

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

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

MikeT
источник
-1

Это два разных термина для одной и той же концепции.
Hashtableа HashMapтакже ссылаться на ту же концепцию.

SLaks
источник
3
На самом деле, Hashtable / Hashmap подразумевает конкретную реализацию в своем имени (например, сбалансированное дерево, которое используется в C ++ std :: map, например).
Джо
В общем, вы не должны заботиться о реализации. (За исключением соображений производительности) Кроме того, это не всегда так; посмотрите на .Net, например.
SLaks
-2

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

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

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

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

Бондо Каломбо
источник