2016-12-08 5 views
2

Чтобы отобразить группу целочисленных переменных к значениям (сказать, что я a1, a2, a3, a4, a5, a6 для определения значения v; это карта как map<tuple<int, int, int, int, int, int>,VALUE_TYPE> или map<struct{int, int, int, int, int, int},VALUE_TYPE>), мы можем использоватьC++ эффективный способ отображения группы целочисленных переменных к значениям

  1. строку, построенную из целых чисел в качестве ключа
  2. кортежа как ключевая
  3. структуры или класса в качестве ключа
  4. и так далее ...

Мне очень интересно узнать о выполнении этих методов. В моей ситуации,

  1. меньше вставки, более запрос
  2. широкий диапазон, но скудны распределение целочисленных ключей
  3. время меня беспокоит более, памяти меньше
  4. Карта доступа является самым потребляя часть, так что даже 10 % вопросы ускорения

Вопрос в том, какой способ лучше работает в моей ситуации?
Если выбрана клавиша struct или class, есть ли какой-либо трюк, чтобы сделать компаратор более эффективным?
Действительно ли неупорядоченный_мап лучше подходит для этой ситуации? Как мне рассчитать хэш ключей?

Буду признателен за любые предложения или комментарии по решениям. Также приветствуется обсуждение более общей ситуации. Заранее спасибо.

+0

Переменные переменных в значения? Просто сохраните значения в них. – StoryTeller

+1

std :: map может отображать целые числа в значения. Почему вы рассматриваете строки, кортежи или пользовательские классы? Поместите целые числа на карту. – nvoigt

+0

Ключ - это целые числа, такие как [x, y, z], если использовать 3 переменные для определения значения. Я отредактировал вопрос, чтобы устранить двусмысленность. @ Nvoigt @storyteller – yuiyin

ответ

4

В основном: Реализовать различные решения, написать программу тестирования производительности и измерить!

Наверняка:

  • Используя целые числа, как целые числа будет быстрее, чем преобразование их в строки.
  • Структура (или класс) должна быть быстрее кортежа (мой опыт).
  • Также попробуйте контейнер std::array<> (уже предоставляет операторы для сравнения).
  • Карта хэша (std::unordered_map<>) быстрее, чем отсортированная карта (std::map<>), но ее можно использовать, конечно, только если вам не нужно искать с частичными ключами.
+0

В качестве дополнения: 'std :: unordered_map' может быть менее эффективным, чем' std :: map' для длинных ключей: сравнение двух массивов для '<' обычно использует только пару первых элементов, тогда как вычисление хэша намного дороже , Например, на моей машине 10 000 вставок 'std :: array ' to 'std :: map' в 3 раза быстрее, чем' std :: unordered_map'. Однако это, вероятно, не относится к теме стартера. – alexeykuzmin0

+0

Использование массива для типа ключа - это блестящая идея, на мой взгляд. Хотя я не тот, кто спрашивает, спасибо за это. – JohnB

+0

с использованием 'std :: array' будет хорошим, если порядок элемента внутри' array' имеет значение. – sameerkn

0

Кроме того, рассмотрите возможность использования структуры данных trie, если ваши номера относительно невелики, и у вас их много в ключе. Точно так же, как std::unordered_map, это позволит вам получить доступ к элементу в O(l), где l - это длина ключа, но также он позволит вам итерации выбрасывать все значения в порядке возрастания и находить значение с помощью частичного ключа. Проблема в том, что потребление памяти будет пропорционально размеру алфавита (конечно, вы можете хранить внутренние ребра в некоторой сложной структуре данных, но это будет отрицательно влиять на производительность).