Если бы это были настоящие числа, с которыми я бы работал, я бы использовал массив, в котором заданный индекс содержит массив всех записей, которые содержат индекс. Если бы действительные числа были больше, я бы использовал хеш-таблицу, использованную таким же образом.
Таким образом, структура будет выглядеть (пустые индексы исключены в случае реализации массива):
10 => ((10,20,30,40)),
11 => ((11,12,30,40)),
12 => ((11,12,30,40), (12,20,30,40)),
20 => ((10,20,30,40), (12,20,30,40)),
30 => ((10,20,30,40), (11,12,30,40), (12,20,30,40)),
40 => ((10,20,30,40), (11,12,30,40), (12,20,30,40)),
Мне не ясно, являются ли ваши поиски инклюзивным (на основе ИЛИ) или эксклюзивным (на основе И), но в любом случае вы ищите группы записей для каждого элемента поискового набора; для инклюзивного поиска вы найдете их объединение, а для эксклюзивного поиска вы найдете их пересечение.