станд :: unordered_map гарантирует O (1) поиск по времени, но как это удается столкновение?
Он использует открытую адресацию/отдельную цепочку, см. here.
Cppreference утверждает
Неотсортированная отображение является ассоциативный контейнер, который содержит пары ключ-значение с уникальным ключом. Поиск, вставка и удаление элементов имеют среднюю постоянную сложность.
Предполагая, что все коды хэша одинаковы, как происходит столкновение внутри?
Сопутствующие элементы добавляются в другой контейнер, содержащий все значения, которые хэшируются в этом ковше. Этот контейнер обычно является связанным списком, но нет ничего, что останавливает реализацию, например, двоичное дерево.
Мое предположение было бы совершенно неправильным, если хеш-код является уникальным для каждого ключа. В этом случае, как создается уникальный хеш-код, где вообще нет столкновений?
unordered_map не требуется или ожидается что-либо особенное, чтобы избежать столкновений. (Хеш-коды будучи «уникальным для каждого ключа» не хватает в любом случае, так как столкновения могут быть созданы, когда хэш-коды замаскированы или обр-е изд в число ковшей.)
Какой подход делает зЬй: : функция хэш-функции unordered_map принимает, чтобы гарантировать O (1) поиск?
В этом суть вашего непонимания. unordered_map имеет производительность O (1), когда хеш-функция выполняет адекватное задание хэширования ключей по ковши. Он может ухудшаться до O (n), если хеш-функция плоха или была намеренно нацелена на вредоносный ввод ключей, известных хешу, в одно и то же ведро. Стандарт не требует реализаций, чтобы предотвратить это, но пользователи могут предоставить криптографический хеш, выбрать хеш-функцию из семейства во время выполнения или иным образом сделать непрактичным для злонамеренного пользователя или аналогичных входов в целом - создать еще много столкновений.
Слово * среднее * важно здесь. 'Unordered_map' амортизируется константой, а не _constant_. –