数组是“列表的列表”,其中每个列表级别的长度相同。一个 维数组的大小(有时称为“形状”)表示为 。最常见的数组类型是二维 矩形数组,具有 列和 行。如果 ,则结果为方阵。有时,数组中元素的顺序很重要(如在矩阵中),而在其他时候,模反射(以及对于方阵的旋转)等价的数组被认为是相同的(如在幻方或素数数组中)。
在Wolfram 语言中,深度为 的数组使用嵌套列表表示,可以使用以下命令生成数组[a, i, j, ...]。类似地,可以使用以下命令找到数组的维度Dimensions[t],以及命令ArrayQ[expr] 测试表达式是否为完整数组。例如,取
t=Array[a,{2,2,2,3}]
给出深度为 4 的列表
{{{{a[1,1,1,1],a[1,1,1,2],a[1,1,1,3]}, {a[1,1,2,1],a[1,1,2,2],a[1,1,2,3]}}, {{a[1,2,1,1],a[1,2,1,2],a[1,2,1,3]}, {a[1,2,2,1],a[1,2,2,2],a[1,2,2,3]}}}, {{{a[2,1,1,1],a[2,1,1,2],a[2,1,1,3]}, {a[2,1,2,1],a[2,1,2,2],a[2,1,2,3]}}, {{a[2,2,1,1],a[2,2,1,2],a[2,2,1,3]}, {a[2,2,2,1],a[2,2,2,2],a[2,2,2,3]}}}}
维度为 2, 2, 2, 3。
为了穷举列出给定形状的不同数组的数量,其中每个元素都是 种可能选择之一,通过遍历每种情况并检查它是否等价于较早的情况的朴素算法几乎已经是最高效的了。运行时间必须至少是答案的数量,这非常接近 ,以至于差异并不显著。
然而,找到给定形状的可能数组的数量要容易得多,并且可以使用 波利亚枚举定理获得精确公式。对于 数组的简单情况,即使这样也证明是不必要的,因为只有几种可能的对称类型,允许显式计数可能性。例如,考虑 和 偶数且不同的情况,因此只需要包括反射。以一个具体案例为例,设 和 ,因此数组看起来像
(1)
|
其中每个 、、...、 可以取值从 1 到 。可能的排列总数为 (一般情况下为 )。与其左右镜像图像等价的排列数为 (一般情况下为 ),与其上下镜像图像或旋转 度也相同。还有 种排列(一般情况下为 )具有完全对称性。
一般来说,因此以下公式成立
(2)
|
所以有
(3)
|
种排列没有对称性。现在除以每种类型图像的数量,对于 且 为 偶数 的情况,结果为
(4)
| |||
(5)
|
因此,数字的数量级为 ,其中“校正”项的阶数要小得多。