2013-05-16 3 views
3

Я пытаюсь объяснить Map (aka hash table, dict) тому, кто новичок в программировании. Хотя понятия Array (= список вещей) и Set (= сумка вещей) знакомы всем, мне трудно найти метафору реального мира для Карт (меня особенно интересует python dicts и Javascript Objects). Часто используемый словарь/телефонная книжная аналогия неправильна, потому что словари отсортированы, в то время как Карты нет - и эта точка важна для меня. Итак, вопрос в том, что было бы феноменом реального мира или устройством, которое ведет себя как карта в вычислениях?Карты (hashtables) в реальном мире

+0

'SortedMap' сортируется в Java, я думаю !!!! – NINCOMPOOP

+0

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

+0

Я просто понял, что «словарь/аналогий телефонной книги» также не имеет смысла как аналог реального мира! Счастлив, ты спросил это! –

ответ

3

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

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

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

Список: Чтобы добавить, вы просто добавляете его в нижнюю часть списка. Чтобы отступить, вы просто удаляете себя из списка. Если вы хотите увидеть, кто что-то приносит и что они приносят, вам нужно отсканировать весь список, пока вы их не найдете. Если вы не найдете их после сканирования, то они явно не в списке и ничего не приносят. В списке явно будут дубликаты людей с таким же именем.

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

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

+0

Это имеет большой смысл. Спасибо за ответ и приветствуем StackOverflow! – georg

1

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

2

Возможно, было бы аналогией человека, что ваша встреча в первый раз:

Каждого человек имеет неупорядоченное количество атрибутов, каждый из этих атрибутов может иметь только 1 значение, которое является уникальным (например, hair=long, eye_color=blue). И вы обнаружите эти атрибуты в определенном порядке.

Так что для человека она может иметь shoesize=38, hair_color=brown и eye_color=blue и при чтении (human_dict.get('shoe_size')), это кому-то еще вы бы упомянуть атрибуты в произвольном порядке, за исключением по имени атрибута.

+0

-1 Это больше похоже на запись, где набор ключей известен и (несколько) постоянный, а значения неоднородны. Люди уже склонны объединять карты и объекты, когда узнают, что многие динамические языки * реализуют * объекты, используя хеш-таблицы, не нужно укреплять эту путаницу. – delnan

1

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

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

И наоборот, в массиве A (int) указаны карты, где индекс 1 сопоставляется с адресом A, 2 - адресом A + 4 и т. д ....

1

В некоторых ресторанах, когда вы делаете заказ в стойке, они дают вам номер для идентификации вашего заказа. Номера:

  • Не нужно сортировать.
  • Не нужно быть последовательными

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

После того как вы сделаете ваш заказ, они будут использовать тот же номер для другого заказа. Таким образом, число в основном является идентификатором для заказа в определенный момент времени, это соответствовало бы примеру Javascript Object, где свойства объектов могут изменять их значение.

Смежные вопросы