让 {f(i)},i = 1,...,n 成为一系列过滤器(列表的每个项目都映射到一个布尔值值)具有属性:如果 f(i)= 1 列表的某个项目,则每个 f(j) = 1 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
应用于t
的前两项(已被f1
接受)。
问题:如何避免将 f(j)应用于 f(i)为 j&gt>接受的项目;我?
我天真的实施
I. -. f1 t
- f1不接受的那些项目的索引。那么为什么不选择它们,应用f2
并修改?我认为这是一种错误的方式,因为这种方法使用了大量的内存,对吧?
t #~ (f1 t) (I. -. f1 t)}~ f2 (I. -. f1 t) { t
0 1 2 4
很难为许多过滤器编码。
答案 0 :(得分:3)
虽然可以避免以你在这里寻求的方式进行计算,但这样做往往会对谷物产生影响。 J.值得注意的是,这样做可能会增加时间和空间要求。
一种技巧是使用f1
的结果将参数过滤为f2
,然后展开f2
的结果以与f1
的结果对齐。这将涉及在内存中创建一个新数组,以便具有完全必要的值,加上一个临时结果数组,并对该结果进行计算,使其符合原始参数的形状。这些东西不是免费的。
最重要的是,这种微观管理涉及摆脱J程序员所谓的数组思维。涉及与名词一起使用的解决方案"作为一个整体" (以及符合规范的矩形)通常可以简化J中的表达。
对于某些类型的数据的某些类型的计算,您提出的问题类别可能很重要。在这种情况下,可能值得设计一些技术来传达部分结果并有选择地避免动词的可避免应用。我认为Power(^:
)在许多此类努力中都很有用。但是这些解决方案都非常适用于出现实际性能问题的情况。
我承担了提出以下声明的风险:您的问题没有一般答案,因为J的一般性不支持细粒度干预。我怀疑你对J表现出这种偏见有充分的理解。这种偏见使你提出的问题成为一个技术难题。
由于这个问题的解决方案通常不会在更短的时间内运行,也不会在更少的时间内运行,也不会有助于简洁的表达,也不会提供功能清晰度,优化"对他们来说似乎不太可能是标签。