具有最小内存占用的连续项目比较

时间:2012-05-28 23:20:04

标签: optimization j memory-optimization

在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个临时阵列,总内存使用量为2(n-1)

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

另一种直观地工作的方法需要更多的记忆:

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

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

对于同一操作,什么是更精简的替代方案?

1 个答案:

答案 0 :(得分:1)

编辑:

在J504中,使用rotate(1 |。)似乎是目前为止的最佳选择:

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

我希望

2<:/\y
鉴于2 f/\yspecial code since J 4.06

更好更多。如果<:是表现不佳的原因,请尝试:

0>:2-/\ y