C++ задачка на производительность (объединение и пересечение множеств)

Цена договорная • электронные деньги
20 августа 2014, 08:26 • 7 откликов • 87 просмотров
Имеется массив массивов из чисел. Числа в рамках каждого подмассива уникальны и отсортированы по возрастанию:


DATA = [

[1, 3, 5, 7, 9], #0

[2, 4, 6, 8, 10], #1

[1, 2, 3, 5, 8], #2

[1, 2, 3, 4, 5], #3

]


На вход подаётся запрос в виде массива массивов
из индексов (каждый индекс - это индекс подмассива в DATA)


QUERY = [

[#0, #2],

[#1, #3],

]


Для каждого подмассива в QUERY нужно найти
объединение чисел из соответствующих подмассивов DATA, результат должен быть
отсортирован по возрастанию:


[#0, #2] = union([1, 3, 5, 7, 9], [1, 2, 3, 5,
8]) = [1, 2, 3, 5, 7, 8, 9]

[#1, #3] = union([2, 4, 6, 8, 10], [1, 2, 3, 4,
5]) = [1, 2, 3, 4, 5, 6, 8, 10]


Затем найти пересечение среди полученных
объединений, результат опять же отсортирован по возрастанию:


RESULT = intersection([1, 2, 3, 5, 7, 8, 9], [1,
2, 3, 4, 5, 6, 8, 10]) = [1, 2, 3, 5, 8]


Этот результат нужно вывести на экран.


Программа должны использовать константный объем
памяти на запрос. Размер DATA ограничен только объёмом доступной памяти.
QUERY может содержать вплоть до всех индексов в любой комбинации. Данные для теста можно
сгенерировать случайно.


Цель - достигнуть максимальной
производительности. Скорее всего нужны будут специальные оптимизации для
случаев когда подмассив в QUERY имеет один, два или три индекса, а также общую
реализацию для N.

В идеале нужно написать несколько решений и
бэнчмарк оценивающий скорость каждого.


От вас я ожидаю оценки по стоимости и сроку.