У меня есть структура данных вроде этого:
struct X {
float value;
int id;
};
вектор тех (размер N (думаю, 100000), отсортированный по значению (остается постоянным во время выполнения программы):
std::vector<X> values;
Теперь я хочу написать функцию
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
который заполняет параметр out с помощью отсортированного подмножества значений, заданного пройденными идентификаторами (размер M < N (около 0,8 раза N)), быстро (память не проблема, и это будет сделано многократно, поэтому построение lookuptables (вспомогательные данные из параметров функции) или что-то еще, что выполняется только один раз, полностью в порядке).
Мое решение до сих пор:
Создайте lookuptable lut, содержащий id → offset в значениях (подготовка, так что постоянное время исполнения)
создайте std::vector<X> tmp
, размер N, заполненный недействительными идентификаторами (линейный в N)
для каждого id, скопируйте values[lut[id]]
в tmp[lut[id]]
(линейный в M)
loop over tmp, копирование элементов на выход (линейный в N)
это линейно в N (как это больше, чем M), но временная переменная и повторное копирование меня задевают. Есть ли способ сделать это быстрее, чем это? Обратите внимание, что M будет близок к N, поэтому вещи, которые являются O (M log N), являются неблагоприятными.
Изменить: http://ideone.com/xR8Vp - пример реализации упомянутого алгоритма, чтобы сделать желаемый вывод ясным и доказать, что он выполним в линейном времени - вопрос заключается в возможности избежать временной переменной или ускорить ее каким-то другим способом, то, что не является линейным, происходит не быстрее:).