在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)。
对于同一操作,什么是更精简的替代方案?
答案 0 :(得分:1)
在J504中,使用rotate(1 |。)似乎是目前为止的最佳选择:
smallerS =: <:1&|.
l =: ?. 10000$1000
;memuse &.> 'smaller l';'smaller2 l';'smallerS l'
148480 214400 82880
我希望
2<:/\y
鉴于2 f/\y
为special code since J 4.06,更好更多。如果<:
是表现不佳的原因,请尝试:
0>:2-/\ y