Быстрый хеш для std :: set <int>двух значений? - PullRequest
2 голосов
/ 02 сентября 2010

Я использую std::set<int> для ключа карты STD (std::unordered_map<std::Set<int>,float>).Мне нужен хеш для этого набора.

В наборе всегда будут только два целых числа, значения которых могут быть до 2 миллионов.

Любые идеи относительно хорошего и быстрого хэша для такого ключакак производительность критична?

Ответы [ 3 ]

4 голосов
/ 02 сентября 2010

Вы можете использовать boost :: hash_combine (): http://www.boost.org/doc/libs/1_44_0/doc/html/hash/combine.html

3 голосов
/ 02 сентября 2010

Вы точно не указали, какова цель вашего поиска, но, возможно, вы должны (или не должны):

  • просто использовать struct {int a, b;} в качестве ключа - вы контролируете вставку элементов (убедитесь, что a <= b)

  • используйте разреженную матрицу реализацию

С уважением

rbo

2 голосов
/ 02 сентября 2010

Я бы отказался от заданной идеи (это пустая трата памяти и времени, чтобы сохранить два целых числа в std::set) и пойти с парой.Затем определите

template <class A>
struct unordered_pair_hash
{
  std::size_t operator()(const std::pair<A, A>& p) const { 
    using std::min;
    using std::max;
    return std::hash<A>()(min(p.first, p.second))+
        17*std::hash<A>()(max(p.first, p.second));
  }
};

template <class A>
struct unordered_pair_eq
{
  bool operator()(const std::pair<A, A>& p1, const std::pair<A, A>& p2) const {
    using std::min;
    using std::max;
    return min(p1.first, p1.second)==min(p2.first, p2.second) &&
           max(p1.first, p1.second)==max(p2.first, p2.second);
  }
};

и затем объявите карту с пользовательским хешем и равенством.

std::unordered_map<std::pair<int, int>, float, unordered_pair_hash<int>, unordered_pair_eq<int> > ...
...