1

J(J6または7ではなくJ503を使用)では、通常、配列の要素が前の要素よりも小さいかどうかを確認したい場合は、次のように使用します。

   smaller =: }:<:}.

その結果、n-1個のアイテムになります。

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

内部的に、 2つの配列}:}.作成し(1つは最後の項目を省略し、もう1つは最初の項目を省略します)、最終的に<:比較を可能にします。合計メモリ使用量は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

それがJ4.06以降の特別なコードであることを考えると、はるかに優れています。パフォーマンスが低下する理由である偶然の機会に、次のことを試してください。2 f/\y<:

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