Какой алгоритм в C++ лучше всего подходит для быстрой вставки уникальных пар чисел типа u64?

Как улучшить алгоритм для хранения уникальных пар uint64_t с очень быстрой вставкой в контейнер, где первый элемент всегда меньше второго? Сейчас используется std::unordered_set с предложенной хэш-функцией, но сомнения вызывают возможные коллизии. Есть ли способ сделать это более эффективно?
  • 21 марта 2024 г. 22:59
Ответы на вопрос 2
Для быстрой вставки уникальных пар чисел типа u64 в C++ можно использовать структуру данных `std::unordered_set<std::pair<uint64_t, uint64_t>>`, которая будет автоматически устранять дубликаты и имеет асимптотическую сложность O(1) для вставки элемента. Однако возможны коллизии хэш-функций, что может повлиять на производительность.

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

Также можно рассмотреть использование других структур данных, таких как `std::set<std::pair<uint64_t, uint64_t>>`, которая автоматически упорядочивает элементы и обеспечивает более эффективный поиск вставки элементов.

В целом, выбор оптимальной структуры данных и хэш-функции будет зависеть от конкретных требований проекта и объема данных, однако экспериментирование с различными вариантами может помочь найти наилучшее решение для конкретного случая.
std::uint64_t hasher(const std::pair<std::uint64_t, std::uint64_t>& src) {
    const uint64_t kMul = 0x9ddfea08eb382d69ULL;
    uint64_t a = (src.first ^ (src.second * kMul)) * kMul;
    uint64_t b = (src.second ^ (a * kMul)) * kMul;
    return a ^ b;
}

Коллизии все равно будут, но значительно меньше
Похожие вопросы