Разница между HashMap и HashTable исключительно в структурах данных

В чем разница между HashTable и HashMap исключительно в контексте структур данных (а не в Java или любом другом языке)?

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

Ответ 1

В терминологии Computing Science карта представляет собой ассоциативное сопоставление контейнеров от ключа к значению. Другими словами, вы можете выполнять операции типа "для ключа K помнить значение V" , а затем "для ключа K получить значение" . Карта может быть реализована по-разному - например, с помощью (возможно сбалансированного) двоичного дерева или хеш-таблицы или даже непрерывного массива структур, сохраняющих ключ/значение.

Хэш-таблица - это структура для хранения произвольных данных, и эти данные необязательно состоят из отдельного ключа и значения. Например, я мог бы иметь хеш-таблицу, содержащую значения {1, 10, 33, 97}, которые были бы их собственными ключами. Когда нет значения, отличного от ключа, это иногда называют "set", а с реализацией хэш-таблицы - "хэш-набор".

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

Ответ 2

Объяснение между hashmap и hashtable вполне корректно, так как оно также подходит для заголовка строковой хэш-карты, реализованной в strmap.c, где stringmap является хэш-таблицей для строк, удовлетворяющих свойствам ключа, value-structure. Здесь говорится:

/*
 *    strmap version 2.0.1<br>
 *
 *    ANSI C hash table for strings.
 *
 *    Version history:
 *    1.0.0 - initial release
 *    2.0.0 - changed function prefix from strmap to sm to ensure
 *        ANSI C compatibility 
 *    2.0.1 - improved documentation<
 *
 *    strmap.c
 *
 *    Copyright (c) 2009, 2011, 2013 Per Ola Kristensson.
 *
 *    Per Ola Kristensson <[email protected]> 
 *    Inference Group, Department of Physics
 *    University of Cambridge
 *    Cavendish Laboratory
 *    JJ Thomson Avenue
 *    CB3 0HE Cambridge
 *    United Kingdom
 *
 *    strmap is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Lesser General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    strmap is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public License
 *    along with strmap.  If not, see <http://www.gnu.org/licenses/>.
 */
#include "strmap.h"
typedef struct Pair Pair;
typedef struct Bucket Bucket;
struct Pair {
    char *key;
    char *value;
};

Ответ 3

Вот как я это понимаю:
Хеш-таблица: что мы называем концепцией в информатике
Hash Map: как это называется в Java
Hash Set (HashSet): случай, когда мы заботимся только об уникальных ключах (или вы можете видеть его как Hash Table, где мы игнорируем значения, мы просто хотим знать, что такое набор уникальных ключей)

Или просто
Хэш-таблица (CS) = HashMap (Java) = Словарь (Python)
Hash Set (CS) = HashSet (Java) = Set (Python)

Ответ 4

C не имеет встроенных контейнеров (кроме массивов), поэтому это зависит от того, что они хотят назвать. Что касается C, то HashMap против HashTable не имеет реального значения.

Одно из возможных различий может быть в том, как создается хранилище резервных копий. Хэш-таблица может быть простым линейным массивом ключей и значений, индексированных хешем. Хэш-карта может быть сбалансированным деревом, упорядоченным по ключу, а также таблицей, которая отображает хэш в дерево node, что позволяет быстро и быстро (O (1)) искать и возможность перемещать данные в порядке очереди.

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