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

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


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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

Мои 2 цента.

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

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

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

Ответ 4

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

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

В Lisp он может выглядеть так:

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

Что инкапсулирует слова:

  • a
  • и
  • ant
  • a
  • объявления

Обход от вершины к листу дает слово.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

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

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

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

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

  • Как таковая, структура данных карты обеспечивает способ перехода от элементов данного набора - известные являются "ключами" на карте к одному или нескольким элементам во втором наборе - известных как связанные "значения".
  • Аспект "... или более элементов во втором наборе" может поддерживаться реализацией двумя различными способами:
    • Многие реализации карт обеспечивают уникальность ключей и позволяют каждому ключу быть связанным только с одним значением, но это значение может быть самой структурой данных, содержащей много значений более простого типа данных, например {{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, который подразумевает контейнер - например, deque должен поддерживать только стирание/удаление спереди и сзади, а не с точки зрения некоторого ключа. Необходимость выполнять больше работы в коде для организации поиска мягко побуждает программиста переключаться на структуру данных контейнера с более эффективным поиском.

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

Ответ 10

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

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

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

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

Ответ 11

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