Пусть {F (I)}, г = 1, ..., п последовательность фильтров (каждый элемент списка отображается логическое значение) со свойством: , еслиF (I) = 1для некоторого элемента списка, то каждыйе (к) = 1дляJ> яи то же самое item. Очень простой пример:J: О применении оптимальной последовательности фильтров к списку
[ t =: i.5 NB. sample data
0 1 2 3 4
f1 =: 2&> NB. is greater than 2
f2 =: 2&> +. 0=2&| NB. is greater than 2 OR even
(f1 ,: f2) t
1 1 0 0 0
1 1 1 0 1
(#~ f1 +. f2) t
0 1 2 4
Очевидно, что нет необходимости применять f2
для первых 2-х предметов t
(который уже был принят f1
).
Вопрос: Как избежать применения F (J) к элементам, который был принят на F (I) для J> я?
Моя наивная реализация
I. -. f1 t
- индексы тех элементов, которые не принимаются f1. Так почему бы не выбрать их, примените f2
и исправьте? Я думаю, что это неправильный путь, потому что этот подход использует много памяти, не так ли?
t #~ (f1 t) (I. -. f1 t)}~ f2 (I. -. f1 t) { t
0 1 2 4
И сложнее кодировать для многих фильтров.
Спасибо, @kaleidic за хорошо обоснованный ответ. Я новичок в J, поэтому мне важно прочитать о парадигмах J по сравнению с популярными. Я понимаю, что парадигма «в целом» теперь лучше, однако я считаю, что задача, с которой я столкнулся, действительно имеет проблемы с производительностью. Вскоре я отредактирую вопрос, чтобы сформулировать свою задачу, но это немного сложно. –
Я подозреваю, что можно применить силу глагола, но то, что я сделал до сих пор о '^:', заключается в том, что предложение '(f2 ^: (-. @: F1))« 0 t »будет применять f2 только для те элементы, которые необходимо отфильтровать, но результат не является логическим списком, поэтому это неэффективное использование памяти. На данный момент я не вижу другого использования. –
К сожалению, я обнаружил, что не могу сформулировать свою проблему, потому что это долгая история, и мой вопрос не очень важен для нее, тем не менее, я узнал важные вещи и понял J немного больше. Спасибо. –