首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >APL中的3+维真值表

APL中的3+维真值表
EN

Stack Overflow用户
提问于 2014-01-03 15:32:57
回答 1查看 313关注 0票数 3

我想列举所有的组合(数值元组)的3个或更多的有限值变量,满足一个给定的条件。在数学符号中:

例如(受Euler项目问题9启发):

一次两个变量的真值表非常简单:

代码语言:javascript
运行
复制
    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之间的正确轴上披露(⊃):

代码语言:javascript
运行
复制
    ⎕← 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过滤所有可能的元组值:

代码语言:javascript
运行
复制
    ⊃ (,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个嵌套循环变成了一个三级真值表:

代码语言:javascript
运行
复制
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中是否有解决算法问题或最佳实践的好书籍或在线资源?

EN

Stack Overflow用户

回答已采纳

发布于 2014-01-07 17:18:03

这是另一种方法。我不确定它会不会跑得更快。按照标量语言的算法,c的可能值是

代码语言:javascript
运行
复制
⎕IO←0
c←1+⍳NC

在内部循环中,ba的值为

代码语言:javascript
运行
复制
b←1+⍳¨NB⌊c
a←1+⍳¨¨NA⌊b

如果我们把这些

代码语言:javascript
运行
复制
r←(⊂¨¨¨a,¨¨¨b),¨¨¨c

我们得到了一个嵌套的(a,b,c)三重奏数组,它可以在一个矩阵中被平坦和重新排列。

代码语言:javascript
运行
复制
r←∊r
(((⍴r)÷3),3)⍴r

添加:

莫滕·克伦伯格给了我以下解决方案。在Dyalog APL上,它的效率是上面的30倍:

代码语言:javascript
运行
复制
⎕IO←1
AddDim←{0≡⍵:⍪⍳⍺ ⋄ n←0⌈⍺-x←¯1+⊢/⍵ ⋄ (n⌿⍵),∊x+⍳¨n} 
TTable←{⊃AddDim/⌽0,⍵}
TTable 3 4 5
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20907144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档