2014-09-24 11 views
3

Пусть {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 

И сложнее кодировать для многих фильтров.

ответ

3

Несмотря на то, что вы можете избегать вычислений таким образом, что вы ищете здесь, это ведет к «против зерна» J. Примечательно, что это может увеличить время и пространство.

Один из методов будут использовать результат f1 для фильтрации аргумента f2, а затем расширить результат f2 для выравнивания с результатом f1. Это будет связано с созданием нового массива в памяти, чтобы иметь точно необходимые значения, а также временный массив результатов, а также вычисление по этому результату, чтобы он соответствовал форме исходного аргумента. Эти вещи не бесплатны.

Самое главное, что такое микроуправление включает в себя переход от того, что программисты J называют мышью массива. Решения, связанные с работой с существительными «в целом» (и как соответствующие прямоугольники), часто поддаются сжатию в J.

Для определенных типов вычислений для определенных типов данных класс проблем, который вы поставили, вполне может быть важный. В таких случаях было бы целесообразно придумать какую-либо технику для передачи частичных результатов и выборочного исключения избегаемого применения глагола. Я бы предположил, что Power (^:) будет полезен во многих таких усилиях. Но все эти решения были бы совершенно конкретными для ситуаций, когда возникали проблемы с производительностью.

Я беру на себя риск сделать следующее заявление: общий ответ на ваш вопрос, потому что общие черты J не поддерживают мелкозернистую интервенцию. Я подозреваю, что у вас есть четкое понимание того, что J проявляет это предвзятое отношение. Этот уклон является тем, что ставит вопрос, на который вы поставили технически сложный вопрос.

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

+0

Спасибо, @kaleidic за хорошо обоснованный ответ. Я новичок в J, поэтому мне важно прочитать о парадигмах J по сравнению с популярными. Я понимаю, что парадигма «в целом» теперь лучше, однако я считаю, что задача, с которой я столкнулся, действительно имеет проблемы с производительностью. Вскоре я отредактирую вопрос, чтобы сформулировать свою задачу, но это немного сложно. –

+0

Я подозреваю, что можно применить силу глагола, но то, что я сделал до сих пор о '^:', заключается в том, что предложение '(f2 ^: (-. @: F1))« 0 t »будет применять f2 только для те элементы, которые необходимо отфильтровать, но результат не является логическим списком, поэтому это неэффективное использование памяти. На данный момент я не вижу другого использования. –

+0

К сожалению, я обнаружил, что не могу сформулировать свою проблему, потому что это долгая история, и мой вопрос не очень важен для нее, тем не менее, я узнал важные вещи и понял J немного больше. Спасибо. –