Это на С++. Мне нужно вести счет для каждой пары чисел. Два числа имеют тип «int». Я сортирую два числа, поэтому пара (n1 n2) совпадает с парой (n2 n1). Я использую std::unordered_map в качестве контейнера.
Я использовал элегантную функцию сопряжения, разработанную Мэтью Шудзиком, Wolfram Research, Inc.. В моей реализации функция дает мне уникальное число типа "long" (64 бита на моей машине) для каждой пары двух чисел типа "int". Я использую это как мой ключ для unordered_map (std::unordered_map). Есть ли лучший способ вести подсчет таких пар? Под «лучше» я подразумеваю «быстрее» и, если возможно, с меньшим использованием памяти.
Кроме того, мне не нужны все биты long. Даже если вы можете предположить, что два числа могут достигать максимального значения для 32 бит, я предполагаю, что максимально возможное значение моей функции сопряжения потребует не более 36 бит. Если ничего другого, по крайней мере, есть ли способ использовать всего 36 бит в качестве ключа для unordered_map? (какой-то другой тип данных)
Я думал об использовании набора битов, но я не совсем уверен, будет ли std::hash генерировать уникальный ключ для любого заданного набора битов из 36 бит, который можно использовать в качестве ключа для unordered_map.
Буду очень признателен за любые мысли, предложения и т.
std::set
длины 2 для каждой пары? Таким образом, порядок не важен. - person Cory Kramer   schedule 06.10.2014long
- не полагайтесь на машину, используйте более конкретные типы, например:uint64_t
- person Karoly Horvath   schedule 06.10.2014