我想列举所有的组合(数值元组)的3个或更多的有限值变量,满足一个给定的条件。在数学符号中:
例如(受Euler项目问题9启发):
一次两个变量的真值表非常简单:
    a ∘.≤ b
1 1 1 1
0 1 1 1
0 0 1 1
    b ∘.≤ c
1 1 1 1 1
0 1 1 1 1
0 0 1 1 1
0 0 0 1 1经过多次绞尽脑汁之后,我设法将它们结合起来,方法是计算前者每4值行的∧和后者的每4值列,并在1到2之间的正确轴上披露(⊃):
    ⎕← tt ← ⊃[1.5] (⊂[2] a ∘.≤ b) ∘.∧ (⊂[1] b ∘.≤ c)
1 1 1 1 1
0 1 1 1 1
0 0 1 1 1
0 0 0 1 1
0 0 0 0 0
0 1 1 1 1
0 0 1 1 1
0 0 0 1 1
0 0 0 0 0
0 0 0 0 0
0 0 1 1 1
0 0 0 1 1然后,我可以使用它的ravel过滤所有可能的元组值:
    ⊃ (,tt) / , a ∘., b ∘., c
1 1 1                       
1 1 2                       
1 1 3                       
1 1 4                       
1 1 5                       
1 2 2                       
1 2 3                       
...
3 3 5                       
3 4 4                       
3 4 5                       这是解决APL中这类特殊问题的最佳方法吗?
在这个例子中,还是在一般情况下,是否有一个更简单或更快的公式?
更广泛地说,比较我的(天真?)在传统标量语言的数组方法上面,我可以看到我正在将每个循环转换成一个额外的维度:3个嵌套循环变成了一个三级真值表:
for c in 1..NC:
    for b in 1..min(c, NB):
        for a in 1..min(b, NA):
            collect (a,b,c)但是在一种标量语言中,可以在此过程中进行优化,例如,尽快断开循环,或者动态地选择循环边界。在这种情况下,我甚至不需要测试≤b≤c,因为它隐含在循环边界中。
在本例中,这两种方法都具有O(N立方)的复杂性,因此它们的运行时只会因一个因素而不同。但我想知道:如果我需要这样做的话,如何才能以更优化的方式编写数组解决方案呢?
在APL中是否有解决算法问题或最佳实践的好书籍或在线资源?
发布于 2014-01-07 17:18:03
这是另一种方法。我不确定它会不会跑得更快。按照标量语言的算法,c的可能值是
⎕IO←0
c←1+⍳NC在内部循环中,b和a的值为
b←1+⍳¨NB⌊c
a←1+⍳¨¨NA⌊b如果我们把这些
r←(⊂¨¨¨a,¨¨¨b),¨¨¨c我们得到了一个嵌套的(a,b,c)三重奏数组,它可以在一个矩阵中被平坦和重新排列。
r←∊r
(((⍴r)÷3),3)⍴r添加:
莫滕·克伦伯格给了我以下解决方案。在Dyalog APL上,它的效率是上面的30倍:
⎕IO←1
AddDim←{0≡⍵:⍪⍳⍺ ⋄ n←0⌈⍺-x←¯1+⊢/⍵ ⋄ (n⌿⍵),∊x+⍳¨n} 
TTable←{⊃AddDim/⌽0,⍵}
TTable 3 4 5https://stackoverflow.com/questions/20907144
复制相似问题