Хэш-таблица и карта хэш-таблица реализована как функция хэша, но карта реализована как дерево.Использование хэш-таблицы и карты
Вопрос в том, в какой ситуации хэш-таблицу нельзя использовать, но карта обязательна?
Хэш-таблица и карта хэш-таблица реализована как функция хэша, но карта реализована как дерево.Использование хэш-таблицы и карты
Вопрос в том, в какой ситуации хэш-таблицу нельзя использовать, но карта обязательна?
Одной из мотиваций выбора карты по хеш-таблице является ограничение, которое каждый из них указывает на тип ключа, используемый в создании шаблона. Как описано в the documentation for hash_map in the SGI implementation of STL, конкретизация hash_map требует предоставления функтора, который Хэш К. СТЛ включает в себя функтор, std::hash, который делает это, но он реализован только для ограниченного набора типов Т.
конкретизации станда: : карта с другой стороны требует только функтора, который сравнивает объекты типа K для генерации слабого упорядочения. Стандартный функтор std::less будет работать для любого T, который определяет оператор <.
Это означает, что для многих пользовательских типов добавление поддержки, необходимой для использования этого типа в качестве ключа в std :: map, намного меньше, чем требуется для использования в std :: hash_map.
Помимо вопроса о накладных,
hash_map будет быть включенным в C++ 0x, поскольку std :: unordered_map –
@gareth - std :: unordered_map уже широко доступен (GCC/VS08) как часть TR1. Кроме того, генерация хэш-ключей для пользовательских типов тривиальна с библиотекой Boost.Hash, которая должна быть стандартизована когда-нибудь (возможно, в TR2?) – Manuel
Когда вы зависите от того, что ключи отсортированы.
Я собираюсь ответить в отношении std :: unordered_map (хеш-таблица) и std :: map (дерево). Обратите внимание, что ни один из них на самом деле не указывает механизмы реализации. В принципе, вы используете карту, когда вам нужно получить доступ к ключам в отсортированном порядке и в противном случае unordered_map.
Существует ряд потенциальных причин.
std::map
, необходимо или желательно.В время выполнения характеристики различны:
древовидная карты всегда имеет время (в худшем случае, средний случай) в порядке O (LOG п), т.е. высота (сбалансированного) двоичного дерева поиска.
Хэш-карты, с другой стороны, имеют гораздо более сложное поведение во время выполнения. Но в обычном случае хэш-таблица имеет ожидаемый время выполнения O (1), то есть константа служебные данные.
В общем, худшем случае является O (п), который звучит плохо. Однако можно показать, что для хорошего выбора параметров этот худший случай становится настолько редким, что не играет роли на практике. «Редкий» здесь означает действительно редко, как в выигрыше лотереи десять раз подряд, а затем убивается кометами. На практике плохой выбор параметров (метод хэширования, коэффициент нагрузки ...) может значительно повысить эту вероятность.
Если вам нужно найти «следующий» элемент в структуре данных, хеш-таблица не может использоваться, поскольку она не сохраняет элементы в прохождении по порядку.
Потенциальный дубликат: http://stackoverflow.com/questions/2196995/is-there-any-advantage-of-using-map-over-unordered-map-in-case-of-trivial-keys – Manuel