Мне нужно сделать много союзов упорядоченного набора целых чисел (я бы хотел избежать дубликатов, но это нормально, если есть).Быстрое объединение объединения целого числа
Это код с наилучшей производительности до сих пор:
// some code added for better understanding
std::vector< std::pair<std::string, std::vector<unsigned int> > vec_map;
vec_map.push_back(std::make_pair("hi", std::vector<unsigned int>({1, 12, 1450});
vec_map.push_back(std::make_pair("stackoverflow", std::vector<unsigned int>({42, 1200, 14500});
std::vector<unsigned int> match(const std::string & token){
auto lower = std::lower_bound(vec_map.begin(), vec_map.end(), token, comp2());
auto upper = std::upper_bound(vec_map.begin(), vec_map.end(), token, comp());
std::vector<unsigned int> result;
for(; lower != upper; ++lower){
std::vector<unsigned int> other = lower->second;
result.insert(result.end(), other.begin(), other.end());
}
std::sort(result.begin(), result.end()); // This function eats 99% of my running time
return result;
}
Valgrind (с помощью инструмента callgrind) говорит мне, что я провожу 99% времени делает вид.
Это то, что я пытался до сих пор:
- Использование зЬй :: набор (очень плохой производительности)
- Использование зЬй :: set_union (плохая производительность)
- сохраняя кучу с станд :: push_heap (на 50% медленнее)
Есть ли какая-нибудь надежда получить какую-то производительность? Я могу изменить свои контейнеры и использовать boost и, возможно, некоторые другие lib (в зависимости от их лицензии).
EDIT целые числа могут быть как большой 10 000 000 EDIT 2 дал несколько примеров того, как я использую его, из-за какой-то путаницы
Являются ли целые числа целыми числами 0..31? Если это так, вы можете просто побитовое ИЛИ собрать целую кучу битмаксов .... – jwodder
Есть ли какой-либо шаблон в 'result' после блока for? Похоже, должно быть. –
Нет, целые числа могут идти до нескольких миллионов :( –