Подтвердить что ты не робот

Map vs. hash_map в С++

У меня вопрос с hash_map и map в С++. Я понимаю, что map находится в STL, но hash_map не является стандартом. Какая разница между двумя?

4b9b3361

Ответ 1

Они реализованы по-разному.

hash_map (unordered_map в TR1 и Boost; используйте их вместо этого) используйте хеш-таблицу, где ключ хэшируется в слот в таблице, и значение сохраняется в списке, привязанным к этому ключу.

map реализуется как сбалансированное двоичное дерево поиска (обычно это дерево красного/черного).

An unordered_map должен давать немного лучшую производительность для доступа к известным элементам коллекции, но map будет иметь дополнительные полезные характеристики (например, он хранится в отсортированном порядке, что позволяет обход от начала до конца). unordered_map будет быстрее при вставке и удалении, чем a map.

Ответ 2

hash_map - общее расширение, предоставляемое многими реализациями библиотек. Именно поэтому он был переименован в unordered_map, когда он был добавлен в стандарт С++ как часть TR1. карта обычно реализуется со сбалансированным двоичным деревом, подобным красно-черному дереву (реализации, конечно, различны). hash_map и unordered_map обычно реализуются с помощью хеш-таблиц. Таким образом, порядок не поддерживается. unordered_map insert/delete/query будет O (1) (постоянное время), где map будет O (log n), где n - количество элементов в структуре данных. Таким образом, unordered_map работает быстрее, и если вам не нужно, чтобы порядок элементов был предпочтительнее map. Иногда вы хотите сохранить порядок (упорядоченный по ключу), и для этого map будет выбор.

Ответ 3

Некоторые из ключевых различий в требованиях сложности.

Для отображения требуется O (log (N)) время для вставок и находок.

Unordered_map требует "среднего" времени O (1) для вставок и находок, но ему разрешено иметь наихудшее время O (N).

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

Ответ 4

Спецификация С++ не говорит точно, какой алгоритм вы должны использовать для контейнеров STL. Однако он создает определенные ограничения на их производительность, что исключает использование хеш-таблиц для map и других ассоциативных контейнеров. (Они чаще всего реализуются с красными/черными деревьями.) Эти ограничения требуют лучшей производительности в худшем случае для этих контейнеров, чем могут предоставлять таблицы хешей.

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

Ответ 5

Я не знаю, что дает, но hash_map занимает более 20 секунд, чтобы очистить() 150K беззнаковых целочисленных ключей и значений float. Я просто бегу и читаю код другого.

Вот как он включает hash_map.

#include "StdAfx.h"
#include <hash_map>

Я читал это здесь https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap

говоря, что clear() - порядок O (N). Это мне очень странно, но, что так оно и есть.