假设我有一个数组N ← 0 0 0 1 1 1 0 0 1
,我该如何应用扫描\
来实现数组0 0 0 1 2 3 0 0 1
?
+\N
给了我0 0 0 1 2 3 3 3 4
这不是我想要的。
+\¨⊆⍨N
给了我| 1 2 3 | 1 |
更近的位置,但后来我失去了位置。
有没有办法在扫描和乘法中携带原始值,或者可能是更好的方法?
怎么样m←{s-⌈\(s←+\⍵)×2>/0,⍵}
,似乎快两倍?
cmpx 'h r' 'm r'
h r → 1.1E¯5 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
m r → 4.2E¯6 | -63% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
这里有几个选项。使用 \ 可以轻松调整您的原始想法。
或者,对于一个简短(但效率低的 O(n^2))解决方案,⊥⍨¨,\
可以。
为了获得更有效但更长的解决方案,我改编了https://aplcart.info/?q=cumulative%20sum#
可能有更好的东西,但我很难找到它,但它留给读者作为练习;)
f ← {⍵\∊+\¨⊆⍨⍵}
g ← ⊥⍨¨,\
h ← {+\⍵-a\¯2-/0,(a←1,2≠/⍵)/+\¯1↓0,⍵}
f 0 0 0 1 1 1 0 0 1
0 0 0 1 2 3 0 0 1
r ← ? 1e3 ⍴ 2 ⍝ random boolean array
(∧/2≡/f,⍥⊆g,⍥⊆h)r ⍝ they're all the same
1
]runtime -c 'f r' 'g r' 'h r'
f r → 3.6E¯5 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
g r → 7.7E¯5 | +111% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
h r → 7.3E¯6 | -80% ⎕⎕⎕⎕