Я хочу найти индексы набора эффективно. Я использую unordered_map и делаю обратную карту вот так
std::unordered_map <int, int> myHash (size);
Int i = 0;
for (it = someSet.begin(); it != someSet.end(); it++)
{
myHash.insert({*it , i++});
}
Это работает, но неэффективно. Я сделал это, чтобы в любое время, когда мне нужны индексы, я мог получить к ним доступ O (1). Анализ производительности показывает мне, что эта часть стала горячей точкой моего кода.
VTune сообщает мне, что оператор new
является моей точкой доступа. Я предполагаю, что что-то происходит внутри unordered_map. Мне кажется, что это дело должно быть рассмотрено эффективно. Я еще не мог найти хороший способ. Есть ли лучшее решение? правильный конструктор? Может быть, мне следует передать больше информации конструктору. Я просмотрел список инициализации, но это не совсем то, что я хочу.
Обновление: позвольте мне добавить еще немного информации. Набор не так важен; Я сохраняю набор в массив (отсортированный). Позже мне нужно найти индекс уникальных значений. Я могу сделать это в журнале, но это недостаточно быстро. Вот почему я решил использовать хэш. После этого размер набора (столбцы подматрицы) не меняется.
Это возникает из-за вычисления разреженной матрицы, которое мне нужно, чтобы найти индекс подматрицы в большей матрице. Поэтому размер и шаблон поиска зависят от входной матрицы. Это работает разумно на небольших проблемах. Я мог бы использовать таблицу поиска, но пока я планирую делать это параллельно, таблица поиска для каждого потока может быть дорогостоящей. У меня есть точный размер хеша на момент создания. Я думал, отправив его в конструктор, он перестанет перераспределяться. Я действительно не понимаю, почему он перераспределяет так много.
Int
? Вы имеете в видуint
? - person tadman   schedule 31.10.2020std::distance()
равен O(n). - person Eugene   schedule 31.10.2020std::distance()
. Где еще вы могли бы использовать индекс? - person Eugene   schedule 31.10.2020pmr
для размещения вunordered_map
. Если вы просто добавляете элементы, возможно, вы могли бы просто сделать большое резервирование и просто поместить элементы один за другим. - person ALX23z   schedule 31.10.2020SomeSet
, он сказал, что хранит индексы массива. - person ALX23z   schedule 31.10.2020