Чим відрізняється хеш від словника?


46

У чому різниця між Hashі Dictionary?

Виходячи із сценарію сценаріїв, я відчуваю, що вони схожі, але я хотів з’ясувати точні відмінності. Гуглінг мені не дуже допомагав.

Відповіді:


92

Hashце вкрай погано названа структура даних, де програміст плутав інтерфейс з реалізацією ( і було лінь писати повне ім'я, тобто HashTableзамість цього вдаватися до абревіатури Hash).

Dictionaryє «правильним» ім'ям інтерфейсної (= в ADT ), тобто асоціативний контейнер , який відображає (зазвичай унікальні) ключі до (не обов'язково унікальним) значенням.

Хеш-таблиця - це одна можлива реалізація такого словника, яка забезпечує досить хороші характеристики доступу (з точки зору виконання) і тому часто реалізується за замовчуванням.

Така реалізація має дві важливі властивості:

  1. ключі повинні бути доступними та рівними .
  2. записи не з’являються в конкретному порядку в словнику.

(Якщо ключ є хешируемым, означає, що ми можемо обчислити числове значення з ключа, яке згодом використовується як індекс у масиві.)

Існують альтернативні реалізації структури даних словника, які накладають впорядкування на клавіші - це часто називають сортованим словником (і зазвичай реалізується з точки зору дерева пошуку, хоча існують й інші ефективні реалізації).


Підводячи підсумок: словник - це ADT, який відображає ключі до значень. Існує кілька можливих реалізацій цього ADT, з яких одна хеш-таблиця . Hashє помилковим, але в контексті він еквівалентний словнику, який реалізується з точки зору хеш-таблиці.


4
Для прикладу в C ++, стандартні асоціативні шаблони контейнерів не можуть бути реалізовані як хеші, хоча наступний стандарт матиме ефективні хеш-таблиці. Вони покликані unordered_mapпоказати, що вони роблять, а не те, що вони є.
Девід Торнлі

6
"Правильно" згідно з якою владою? У деяких мовах, таких як Ruby і Perl, офіційне - читати "правильне" - назва цих структур "хеш".
nohat

11
@nohat: Помітьте моє використання цитат. Крім того, я вже пояснив , чому ім'я вибране невдало, що не так чи що? Тож якщо вам потрібен авторитет, то я скажу, що це є владою теоретичної поліції інформатики.
Конрад Рудольф

9
Цікаво, що в Ruby 1.9 реально неможливо реалізувати Hashклас із хеш-таблицею, оскільки Ruby 1.9 Hashes зберігає порядок вставки, тоді як хеш-таблиця цього не робить. Так, у Ruby 1.9 назва Hashнавіть більше не відображає реалізацію.
Йорг W Міттаг

7
@hippietrail Ви неправі - по-перше, це об'єктивні описи. Зрештою, я визначаю, чому найменування є поганим та неправильним (див. Нижче). "Занадто лінивий" - це мистецька ліцензія з мого боку, але справа в тому, що причина скорочення імені є сутнісною, тобто немає ніяких причин використовувати тут коротке ім'я, окрім як скоротити ім'я. І ви помиляєтесь щодо "словника": це просто офіційна назва структури даних. Твоє визначення "словника" неправильне в контексті інформатики, а назва передує Python десятиліттями.
Конрад Рудольф

8

"Словник" - це назва поняття. Хештеб - це можлива реалізація.


1
Хеш - це також АДТ. HashTable - це реалізація Hash
Sairam

3
@Sairam Я думаю, що його набагато частіше для "хеш" означає хеш-функцію, а не хеш-таблицю.
jk.

@jk Насправді "хеш" є результатом застосування "хеш-функції / алгоритму" до деякого вводу. Омехо "хеш-таблиця" або "хеш-карта" стосується і об'єкта, що перемішується, до якогось об'єкта (об'єкта в загальній формі, не обмежуючись OOP)
johannes

Є мови, які використовують "Hash" для посилання на структуру типу словника, а не просто на хеш-функцію. Рубі, наприклад .
Шон Бертон

7

Словник - це збірний термін, призначений для будь-якої реалізації структури даних, що використовується для швидкого пошуку / вставки. Цього можна досягти / реалізувати за допомогою різноманітних структур даних, таких як хеш-таблиця, пропуск списків, дерево rb тощо. Хеш-таблиця - це конкретна структура даних, корисна для багатьох цілей, включаючи реалізацію словника.


Хеш - це також АДТ. Чи є певна різниця між Hash і словником ADT?
Сайрам

2
@Sairam: Ні, хеш - це вихід певного виду алгоритму (хеш-функції).

5

Словник використовує ключ для посилання на значення безпосередньо всередині з асоціативного масиву .

тобто (KEY => VALUE)

Хеш частіше описуються як хеш - таблиця , яка використовує хеш - функцію для обчислення позиції в пам'яті (або більш легко масиву) , де значення буде. Хеш візьме КЛЮЧ в якості вхідного даних і дасть значення як вихід. Потім підключіть це значення до індексу пам'яті чи масиву.

тобто KEY => HASH FUNCTION => VALUE

Я думаю, що один прямий, а інший - ні. Функції хешу можуть бути і не ідеальними, а іноді можуть надавати індекс, що посилається на неправильне значення. Але це можна виправити.

Найкраще місце для пошуку: Вікіпедія ( асоціативний масив та хеш-таблиця )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.