Если вы разрешаете неограниченное количество процессоров, вы можете решить эту проблему практически за постоянное время, предполагая, что конкатенация результатов выполняется быстро: просто разбейте массив на куски фиксированного размера и обработайте каждый блок на отдельном процессоре.
Если мы говорим об одном процессоре, я бы сказал, что вам нужно линейное время:
- вам нужно проверить каждый элемент и, если он соответствует предикату, поместить его в результат.
- сортировка или подобное не поможет, потому что вам снова нужно проверять каждый элемент хотя бы один раз.