让我们考虑方阵
(n是矩阵E的维数并且是固定的(例如n = 4或n = 5))。矩阵条目 满足以下条件:
任务是生成所有矩阵E.我的问题是如何做到这一点?有没有共同的方法或算法?这甚至可能吗?什么开始?
答案 0 :(得分:7)
要考虑的一个天真的解决方案是生成每个可能的n
- by - n
矩阵E
,其中每个组件都是一个不大于n
的非负整数,然后取从那些只满足额外约束的矩阵。那复杂性会是什么?
每个组件都可以采用n + 1
个值,并且有n^2
个组件,因此有O((n+1)^(n^2))
个候选矩阵。这有一个疯狂的高增长率。
链接:WolframAlpha analysis of (n+1)^(n^2)
我认为这是不安全的,这是不安全的。
更好的解决方案如下。它涉及很多数学。
让S
成为满足您要求的所有矩阵E
的集合。让N = {1, 2, ..., n}
。
<强>解释强>
让N
上的 指标 具有通常的定义,除非省略对称性要求。
让I
和J
对集合N
进行分区。当D(I,J)
位于n
且n
位于{{D_ij = 1
时,i
成为I
x j
矩阵J
1}}和D_ij = 0
否则。
让A
和B
在S
。然后A
相邻 至B
当且仅当存在I
和J
分区{{1}时} N
。
当且仅当A + D(I,J) = B
与A
相邻时,我们说B
和A
相邻 B
与B
相邻。
A
中的两个矩阵A
和B
路径连接 当且仅当存在它们之间的S
相邻元素的序列。
让函数S
表示矩阵M(E)
的元素之和。
引理1:
E
是E = D(I,J)
上的指标。
<强>证明:强>
这是一个简单的陈述,除了边缘从N
到I
的情况。让J
位于i
,I
位于j
。然后根据J
的定义E_ij = 1
。让D(I,J)
进入k
。如果N
位于k
,则I
和E_ik = 0
,E_kj = 1
。如果E_ik + E_kj >= E_ij
位于k
,则J
和E_ik = 1
,E_kj = 0
。
引理2:
让E_ij + E_kj >= E_ij
置于E
,S
。然后存在E != zeros(n,n)
和I
分区J
,N
位于E' = E - D(I,J)
S
。
<强>证明:强>
让M(E') < M(E)
为(i,j)
。让E_ij > 0
成为I
的子集,可以通过有效的N
路径从i
到达0
。I
不能为空,因为i
位于I
。I
不能N
,因为j
不在I
中。这是因为E
满足三角不等式和E_ij > 0
。让
J = N - I
。然后I
和J
都非空,分区N
。根据{{1}}的定义,不存在任何I
(x,y)
和E_xy = 0
位于x
且I
位于y
1}}。因此,J
中的所有E_xy >= 1
和x
中的I
都会y
。因此
J
。E' = E - D(I,J) >= 0
很明显,因为我们所做的就是从M(E') < M(E)
的元素中减去E
。现在,由于E'
是E
上的指标,N
是D(I,J)
上的指标(引理1 )和N
,我们E >= D(I,J)
是E'
上的指标。因此N
位于E'
。
<强>定理:强>
让S
进入E
。然后S
和E
是路径连接的。
证明(通过归纳):
如果zeros(n,n)
,则该陈述是微不足道的。假设
E = zeros(n,n)
。设E != zeros(n,n)
为M(E)
中值的总和。然后,通过归纳,我们可以假设对于具有E
的任何矩阵E'
,该陈述都是正确的。自
M(E') < M(E)
以来,引理2 ,我们在E != zeros(n,n)
中有E'
个S
。然后归纳假设M(E') < M(E)
与E'
路径连接。因此,zeros(n,n)
与E
路径相关。
<强>推论:强>
集合zeros(n,n)
是路径连接的。
<强>证明:强>
让S
和A
放在B
中。通过定理,S
和A
都路径连接到B
。因此,zeros(n,n)
与A
路径相关。
推论告诉我们B
中的所有内容都是路径连接的。因此,发现S
的所有元素的有效方法是对由以下定义的图执行广度优先搜索。
S
的元素是图表的节点给定一个节点S
,您可以通过简单枚举所有可能的矩阵E
找到E
的所有(可能)未访问的邻居(其中D(I,J)
}}并为每个生成2^n
。枚举E' = E + D(I,J)
应该相对简单(D(I,J)
的每个可能的子集I
都有一个,但空集和D
除外。
请注意,在上一段中,D
和E
都是D(I,J)
上的指标。因此,当您生成N
,时,您不必检查它是否满足三角不等式 - E' = E + D(I,J)
是两个指标的总和,因此它是一个指标。要检查E'
是否在E'
,您需要做的就是验证S
中的最大元素是否超过E'
。
您可以从n
的任何元素开始广度优先搜索,并保证您不会错过任何S
。因此,您可以使用S
开始搜索。
请注意,随着zeros(n,n)
的增加,集S
的基数增长非常快,因此计算整个集合n
只能处理小S
。< / p>