1

在 J(使用 J503,而不是 J6 或 7)中,通常当我想查看数组的元素是否小于其前任时,我使用以下命令:

   smaller =: }:<:}.

这导致 n-1 项:

   smaller 1 2 3 4 5
1 1 1 1
   smaller 1 2 4 3
1 1 0

在内部,}:创建}.两个数组(一个省略最后一项,另一个省略第一项),最后允许<:比较。总内存使用量将2(n-1)用于 2 个临时数组。

   memuse =: 7!:2
   i =: ,(10000#1)?10000
   memuse 'smaller i'
148480

另一种在直觉上效果更好的方法需要更多的内存:

   smaller2 =: 13 : '2<:/\y.'
   memuse 'smaller i'
214400

(J6 处理得更好。但我坚持使用 J5)。

对于相同的操作,什么是更精简的选择?

4

1 回答 1

1

编辑:

在 J504 中,使用 rotate(1|.) 似乎是迄今为止最好的选择:

smallerS =: <:1&|.
l =: ?. 10000$1000
;memuse &.> 'smaller l';'smaller2 l';'smallerS l'
148480 214400 82880

我希望

2<:/\y

好得多,因为这2 f/\y自 J 4.06 以来的特殊代码。如果<:是性能不佳的原因,请尝试:

0>:2-/\ y
于 2012-05-29T21:37:45.367 回答