图的交叉理论与层次映射

本文深入探讨了图的交叉理论与层次映射,重点讲解了有向无环图的层级分配、层级可达性矩阵的概念,以及如何通过算法减少交叉边的产生。文章还介绍了层次结构的长度、宽度和度量,以及合适的层级结构和矩阵的定义。通过详细的算法描述和数学公式,阐述了如何构建适当的矩阵,实现层次结构的直接和间接矩阵表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的交叉理论与层次映射

前提

通常对于一个有向无环图来说,层级分配完成之后,每个层级内的顶点的顺序至关重要。一个良好的层级之间的顶点顺序的分配,可以大大减少交叉边的产生。

层级可达性矩阵

首先需要已知的有向图的层级分配的可达性矩阵。矩阵的行和列都是图中所有的顶点,矩阵中的每个值都是表达两个顶点之间是否可达。例如对于如下的一个有向图:

在这里插入图片描述

的层级可达性矩阵如下:

在这里插入图片描述

矩阵的行和列代表了顶点{A,B,C,D,E,F,G,H,I}。图的层级结构由顶点和有向边组成,其中每个层级是图的顶点集的有序子集。这组层级是有序的,层级结构的每个边都从较低的级别指向较高的级别。 对于上述的有向图来说,层级中的顺序为(A,B),(C,D,E,F)和(G,H,I)。并且只需要两个互连矩阵就能代表三层结构,如下图:

在这里插入图片描述

我们将边的跨度定义为通过从边终止的层级数中减去边起源的层级数得出的差值的大小。如果层次结构中的每个边的跨度均为1,则该层次结构称为“适当”;否则是不正确的。如果层次结构不正确,可以根据需要,通过引入其他顶点以使所有跨度等于1。

层次结构中的级别数在这里称为层次结构的长度,我们将任何级别中的最大顶点数称为层次结构的宽度。边的数量在此称为层次的度量。因此,上述的可达性矩阵代表的图的层次结构的长度为3,宽度为4,度量值为9。如果层次结构的长度为1,则可以说它是平坦的或单层的。

合适的层级结构和矩阵

如果层次结构合适,则绘制层次结构所需要的所有块互连矩阵信息(如果忽略交叉点)都在可达性矩阵的对角线的下方。与适当层级的定义类似,我们说如果每行至少包含一个1,则互连矩阵是适当的。我们说,如果可达性矩阵M是矩阵A’= A + I的有限次幂,则它是适当的。其中,A是位于主对角线的正下方,具有与M相同的块互连矩阵,而A中的所有其他条目均为0,其中I是一个单位矩阵。

算法:去除跨度超过1的边

首先我们需要一个已知层级的可达性矩阵M',通常来说,这个矩阵不是一个适当的矩阵,我们需要根据以下的过程构建一个适当的矩阵。

首先从顶部开始依次访问各个层级,在检查级别φi时,依次检查这个级别的所有顶点{s1 , s2 , … , ski}。比如说在上述的有向无环图中,顶点被分为三个层级φ1,φ2,φ3。层级φ1对应的顶点就是{A,B}。当前正在访问的顶点称为sj,其中sj∈φi。这边使用A(sj)表示顶点sj的前置集合(所有可以到达顶点sj的顶点的集合,包括sj本身)。前置集合A(sj)减去当前顶点sj,在减去集合∪A{sz : sz ∈ [A(sj) ∩ φi+1]},剩下的元素存入集合Dj。如果Dj为空,访问下一个顶点,否则表示出现了跨度大于1的边,需要在层级φi+1的最后面插入虚拟顶点sμ,并且把sμ的前置集合设置为Dj,并且把虚拟顶点sμ加入到sj的前置集合A(sj) 。这样就相当于在跨度大于1的边上插入虚拟顶点,加入一个虚拟顶点,边的跨度就会减少一位。

比如在下图当中,就是在跨度大于1的边6 -> 1当中添加了一个虚拟顶点7,如果同一个层级出现具有除自己外相同的前置集合,需要合并两个虚拟顶点。

在这里插入图片描述

整体流程图如下:

在这里插入图片描述

直接矩阵实现

层次结构的绘图称为地图。 图1的3级图可以完全由图3中所示的两个矩阵的乘积表示。如下图的公式所示
T ( o ) = N 1 N 2 (1) T^{(o)} = N1N2\tag{1} T(o)=N1N2(1)
被称为上述三个层级的“直接矩阵实现”。通常,层次结构的矩阵实现需要以下条件:

a): 有序的矩阵集,其数量等于地图中的层数。
b): 需要实现每个矩阵的有序的垂直和水平索引集。
c): 索引集排序的一致性,以便实现中的相邻矩阵可以合法地相乘在一起。
d): 保留层次结构元素之间指定的所有连接。

间接矩阵实现

在大多数应用中,在满足矩阵实现的条件c)的前提下,映射在各个级别上的顶点排序是可选的。 这允许改变顺序以获得改进的可读性。 在间接矩阵实现中,索引集的顺序可以与直接实现中出现的顺序不同。 另外,只要保留原始顶点和路径,就可以引入与其他矩阵对应的其他级别。细节将在后面讨论。

两级地图

对于在行和列的索引集中没有公共元素的每个适当的m x n二进制矩阵N,考虑通过行和列的排列来最小化两级地图中的交叉数量,并开发了一种算法来实现最小化。下图很好的描述了两级Map中的互联矩阵。

在这里插入图片描述

交叉统计公式

在地图上的交叉是指仅两条边缘的交点。N的交叉数用K(N)或K(p,q)表示,其中p和q分别代表N的行和列的有序索引集。通过检查图6(b)可以看出,对于N在图6(a)中,应该是K(N)=7。

现在假设一个m x n互连矩阵N具有一个有序的垂直索引集V,并且矩阵N的第i行表示为:
V ( i ) = v 1 ( i ) , v 2 ( i ) , v 3 ( i ) , . . . , v n ( i ) . (2) V^{(i)}=v^{(i)}_1,v^{(i)}_2,v^{(i)}_3,...,v^{(i)}_n.\tag{2} V(i)=v1(i),v2(i),v3(i),...,vn(i).(2)
然后,对于有序行对(V(i),V(j))产生的交叉数为:
k ( V ( i ) , V ( j ) ) = ∑ t = 1 n − 1 ∑ p = t + 1 n v t ( j ) v p ( i ) (3) k(V^{(i)},V^{(j)})=\sum_{t=1}^{n-1}\sum_{p=t+1}^{n}v^{(j)}_tv^{(i)}_p\tag{3} k(V(i),V(j))=t=1n1p=t+1nvt(j)vp(i)(3)
通过对所有有序行对求和得出交叉总数K(N):
K ( N ) = ∑ i = 1 m − 1 ∑ j = i + 1 m k ( V ( i ) , V ( j ) ) (4) K(N)=\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}k(V^{(i)},V^{(j)})\tag{4} K(N)=i=1m1j=i+1mk(V(i),V(j))(4)
可以使用基于公式(4)的简单计数技术来确定矩阵中的交叉次数。对于矩阵N中每个1的条目,确定N中1的其他多少条目位于上方和右侧。 将此称为所选条目的计数。 所有计数的总和等于穿越次数。 可以使用此技术来验证示例中出现的某些结果。

矩阵的置换族

如果对N的行和列的索引集之一或两者及其对应的行或列条目进行置换,则交叉计数可能会发生变化。 该属性通常允许减少交叉,同时保留所有连接。为了给减少两级地图中的交叉次数的操作建立基础,引入了矩阵N的置换族。

置换矩阵说明

置换矩阵如果是在左边乘矩阵N,表示矩阵N以当前置换矩阵相对于单位矩阵的行移动情况移动。置换矩阵如果是在右边乘矩阵N,表示矩阵N以当前置换矩阵相对于单位矩阵的列移动情况移动。以行交换为例子,如下图所示:

在这里插入图片描述

令N=P1NP2,其中P1,P2表示置换矩阵。我们说N ∈ F(N),其中F(N)称为矩阵N的置换族。显然,大小为m×n的矩阵N的置换族将具有m!×n!成员,对应于行和列索引的所有可能排列的集合。

最小交叉矩阵

因为适当的互连矩阵N的置换族是有限的,所以必然有一些N* ∈ F(N)使得K(N*)比F(N)的任何其他成员交叉数量都要小。这样的矩阵N*被称为最小交叉矩阵。

如果N具有任何重复的行或列(行或列的值完全一样),则可以在寻求最小交叉矩阵之前消除此类重复项。在找到族F(N)中的最小交叉矩阵N*时,可以通过消除行或列之间的所有重复值,这样就形成了矩阵N的一个压缩矩阵。一旦在压缩矩阵族中找到最小交叉矩阵,就可以将重复的行或列到浓缩矩阵中。上述方式是建立在如下的定理上的:

如果N*是具有两个相同行(或列)的最小交叉矩阵,则重复行或者列在N*中彼此相邻。否则在F(N)中一定存在另外的最小交叉矩阵,这个最小交叉矩阵具有两个相同的行(或列),并且相同的行(或列)彼此相邻。

为了证明上述的定理,我们先假设它是假的。即存在一个含有重复行的最小交叉矩阵,重复行之间互不相邻,并且F(N)中不存在重复行相邻的最小交叉矩阵。那么必然必须有一个最小交叉矩阵N *N*,其中包含N的完整列的子矩阵,形式为N1=(r B r)T,其中r代表N的单行,B代表一个或多个其他行。假设另外两个矩阵N2=(B r r)T、N3=(r r B)T。那么根据假设,一定会有[K(N2) - K(N1)] > 0 && [K(N3) - K(N1)] > 0。那么这跟如下定理[K(N2) - K(N1)] + [K(N3) - K(N1)] = 0矛盾,得以证明。

假设矩阵 N1=(r B r)T、N2=(B r r)T、N3=(r r B)T,其中r代表单行,B代表其他的附件行,有[K(N2) - K(N1)] + [K(N3) - K(N1)] = 0

我们现在结合公式(3)(4)证明如上定理。

证明

对于矩阵N1、N2、N3的交叉数量表示如下:
K ( N 1 ) = ∑ i = 1 m − 1 ∑ j = i + 1 m k ( A ( i ) , A ( j ) ) K(N_1)=\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}k(A^{(i)},A^{(j)}) K(N1)=i=1m1j=i+1mk(A(i),A(j))

K ( N 2 ) = ∑ i = 1 m − 1 ∑ j = i + 1 m k ( B ( i ) , B ( j ) ) K(N_2)=\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}k(B^{(i)},B^{(j)}) K(N2)=i=1m1j=i+1mk(B(i),B(j))

K ( N 3 ) = ∑ i = 1 m − 1 ∑ j = i + 1 m k ( C ( i ) , C ( j ) ) K(N_3)=\sum_{i=1}^{m-1}\sum_{j=i+1}^{m}k(C^{(i)},C^{(j)}) K(N3)=i=1m1j=i+1mk(C(i),C(j))

由于(r B r)表示的矩阵的行位置改变,不能直接使用如上公式,但是转置矩阵(r B r)T表示的行位置就是固定的,所以可以直接使用如上公式。也就是证明[K(N2) - K(N1)] + [K(N3) - K(N1)] = 0,我们只需要证明对于某两行(i,j)有如下关系:
[ k ( B ( i ) , B ( j ) ) − k ( A ( i ) , A ( j ) ) ] + [ k ( C ( i ) , C ( j ) ) − k ( A ( i ) , A ( j ) ) ] = 0 [k(B^{(i)},B^{(j)}) - k(A^{(i)},A^{(j)})] + [k(C^{(i)},C^{(j)}) - k(A^{(i)},A^{(j)})] = 0 [k(B(i),B(j))k(A(i),A(j))]+[k(C(i),C(j))k(A(i),A(j))]=0
接下来我们使用N1矩阵的描述符号a(i)来表达N2、N3

对于N1计算交叉数:
k ( A ( i ) , A ( j ) ) = ∑ t = 1 n − 1 ∑ p = t + 1 n a t ( j ) a p ( i ) k(A^{(i)},A^{(j)})=\sum_{t=1}^{n-1}\sum_{p=t+1}^{n}a^{(j)}_ta^{(i)}_p k(A(i),A(j))=t=1n1p=t+1nat(j)ap(i)
对于N2计算交叉数:
k ( B ( i ) , B ( j ) ) = ∑ t = 2 n − 1 ∑ p = t + 1 n a t ( j ) a p ( i ) + ∑ t = 2 n a t ( j ) a 1 ( i ) k(B^{(i)},B^{(j)})=\sum_{t=2}^{n-1}\sum_{p=t+1}^{n}a^{(j)}_ta^{(i)}_p + \sum_{t=2}^{n}a^{(j)}_ta^{(i)}_1 k(B(i),B(j))=t=2n1p=t+1nat(j)ap(i)+t=2nat(j)a1(i)
对于N3计算交叉数:
k ( C ( i ) , C ( j ) ) = ∑ t = 1 n − 2 ∑ p = t + 1 n − 1 a t ( j ) a p ( i ) + ∑ p = 1 n − 1 a 1 ( j ) a p ( i ) k(C^{(i)},C^{(j)})=\sum_{t=1}^{n-2}\sum_{p=t+1}^{n-1}a^{(j)}_ta^{(i)}_p + \sum_{p=1}^{n-1}a^{(j)}_1a^{(i)}_p k(C(i),C(j))=t=1n2p=t+1n1at(j)ap(i)+p=1n1a1(j)ap(i)
k(B(i),B(j)) - k(A(i),A(j)) :
[ k ( B ( i ) , B ( j ) ) − k ( A ( i ) , A ( j ) ) ] = ∑ t = 2 n a t ( j ) a 1 ( i ) − ∑ p = 2 n a 1 ( j ) a p ( i ) [k(B^{(i)},B^{(j)}) - k(A^{(i)},A^{(j)})] = \sum_{t=2}^{n}a^{(j)}_ta^{(i)}_1 - \sum_{p=2}^{n}a^{(j)}_1a^{(i)}_p [k(B(i),B(j))k(A(i),A(j))]=t=2nat(j)a1(i)p=2na1(j)ap(i)
k(C(i),C(j)) - k(A(i),A(j)) :
[ k ( C ( i ) , C ( j ) ) − k ( A ( i ) , A ( j ) ) ] = ∑ p = 1 n − 1 a 1 ( j ) a p ( i ) − ∑ t = 1 n − 1 a t ( j ) a 1 ( i ) [k(C^{(i)},C^{(j)}) - k(A^{(i)},A^{(j)})] = \sum_{p=1}^{n-1}a^{(j)}_1a^{(i)}_p - \sum_{t=1}^{n-1}a^{(j)}_ta^{(i)}_1 [k(C(i),C(j))k(A(i),A(j))]=p=1n1a1(j)ap(i)t=1n1at(j)a1(i)
两式相加 [k(B(i),B(j)) - k(A(i),A(j)) ] + [k(C(i),C(j)) - k(A(i),A(j))] = 0,即得证。

逆矩阵

一个n×n平方的二元矩阵,当且仅当xij = 1,并且有 i + j = n + 1时,可以称为逆矩阵ζn。一个逆矩阵也是一个置换矩阵。此外,对于所有n,ζnζnT= In,其中 In为单位矩阵,ζnT为ζn的转置矩阵。

交叉不变数Z(N)

现在令M为满足M ∈ F(N)的任何m × n互连矩阵。对于每个这样的M,令M’ = ζmM,并令M’’ = Mζn,。那么可以证明:
K ( M ) + K ( M ′ ) = K ( M ) + K ( M ′ ′ ) = Z ( N ) (5) K(M) + K(M') = K(M) + K(M'') = Z(N)\tag{5} K(M)+K(M)=K(M)+K(M)=Z(N)(5)
ζm和ζn即是逆矩阵也是置换矩阵,这个置换矩阵在行的位置跟单元矩阵完全相反,根据前面的介绍,M’相当于把行顺序进行一个颠覆,M’‘相当于把M的列顺序进行一个交换。结合公式(3)我们能理解到,在行i和j中计算交叉数量的时候,如果是拿第i行所有的条目和第j行所有的条目进行组合的话,那么计算结果就是一个恒定值,跟矩阵列的顺序无关。那么对于K(M) + K(M’’)来说,任意两行所有条目之间互相组合,去除掉索引重复的值,即为最终结果,这个结果与列的顺序无关。是一个恒定值。如下图所示:
在这里插入图片描述
公式总结为:
Z ( N ) = ∑ α = 1 m ∑ β = 1 m [ ∑ i = 1 n ∑ j = 1 n v i ( α ) v j ( β ) − ∑ i = 1 n v i ( α ) v i ( β ) ] (6) Z(N) = \sum_{α=1}^{m}\sum_{β=1}^{m}[\sum_{i=1}^{n}\sum_{j=1}^{n}v_i^{(α)}v_j^{(β)} - \sum_{i=1}^{n}v_i^{(α)}v_i^{(β)}]\tag{6} Z(N)=α=1mβ=1m[i=1nj=1nvi(α)vj(β)i=1nvi(α)vi(β)](6)
该结果表明,置换族F(N)中任何矩阵M的交叉与通过反转M的行或列找到的矩阵的交叉的总和是一个常数。

从(6)中发现ζn的交叉不变数为Z(ζn) = n(n-1)/2。由于Z(ζn) = K(ζn),因此可以立即得出ζn的行或列的反转将产生没有交叉的矩阵。后一个结果显然是正确的,因为单位矩阵没有交叉。

矩阵N的旋转

构造一个矩阵 N = Nr = ζmn,称为N的旋转。由上个议题可以得出:
K ( N r ) = K ( N ) . (7) K(N_r) = K(N).\tag{7} K(Nr)=K(N).(7)
也就是说,交叉点的数目对于互连矩阵及其旋转矩阵来说是相同的,因为一次反转会将原始交叉点数K(N)更改为值Z(N) - K(N),然后进行第二次反转 将数字更改为Z(N) - [Z(N) - K(N)] = K(N)。

因此,如果N*是最小交叉矩阵,则矩阵Nr*也是如此。同样,如果N*是最小交叉,则可以得出从乘积ζmN*和N*ζn中找到的两个矩阵, 都将是最大交叉矩阵。

十进制表示

通过使用十进制代码的属性,可以加快获得最小交叉矩阵的排列。显然,可以通过简单地列出代表矩阵行或列的二进制等效项的十进制数字的有序序列来指定二进制矩阵中的条目。

最小交叉码序列

如果不能通过仅置换行(列)来减少其行(列)与该序列相对应的矩阵N的交叉数K(N),则将十进制码的有序序列描述为最小交叉码序列。显然,要使矩阵N为最小交叉,行和列代码序列都必须为最小交叉序列。

平淡,平淡序列和平淡集

令(r1,r2)为行(列)代码的有序对。如果k(r1,r2) = k(r2,r1),我们说r1和r2构成一个平淡的对,因为交叉数不受顺序互换的影响。如果序列中的每个有序对都是平淡的对,则该代码序列称为平淡的序列。如果平淡序列中的每个对都是一个平淡对,则序列中包含的代码集称为平淡集。

举例,序列(10,14,4,13,9,15,6,9,11,2,7,5)是一个平淡序列,但是这个序列中的所有成员没有构成平淡集。集合{10,14,4}, {4,13,9}, {9,15,6} {9,11,2}, {2,7,5}是所有的平淡集。

在F(N)中找到最小交点矩阵时,其中N没有相同的行或列,如果行或列的最小交点序列包含平淡序列,则该平淡序列中任何平淡对的置换都将产生另一个最小交叉矩阵。 例如,序列(10,14,4,13),(10,14,13,4),(14,10,4,13)和(14,10,13,4)都是最小交叉序列。如果在其行或列中存在包含这些序列之一(按给定顺序)的最小交叉矩阵,则可以通过简单地置换以获得其他阶数来找到至少三个其他最小交叉矩阵。

生成矩阵

显然,通过重复使用(3),可以确定对于任何十进制代码对,是否存在使交叉最小化的优先顺序或该对是否平淡。因此,可以构造尺寸为2n - 1乘2n - 1的方阵En,称为生成矩阵,具有以下特性:

a) 行和列的索引集均由1到2n - 1的十进制数字组成

b) 如果k(i,j) > k(j,i),那么单元格i,j的条目是1;如果k(i,j) < k(j,i),那么单元格i,j的条目是0;如果k(i,j) = k(j,i),那么单元格i,j的条目是0

对于以这种方式构造的矩阵,很明显,如果m < n,则Em是En的子矩阵。如果其索引集S如此有序,使得S的每个有序子序列都是最小交叉序列,则生成矩阵被描述为良性的 。尽管对于n的所有正整数值都存在生成矩阵,但可以证明对于n > 5没有良性生成矩阵。(例如63 x 63生成矩阵E6包含尺寸为61 x 61的非常大的良性子矩阵 )。

如下三张图代表生成矩阵E2,E3,E4,E5
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一致性

假设尺寸为m × n的矩阵N与Em(En)是行一致的(列一致),条件是其行(列)代码的排序与Em(En)的索引集的排序相同,或其他的区别仅在于仅涉及平淡的行(列)对的排列序列不同。

总之,如果矩阵的行数和列数不超过5,则可以通过直接引用E5来确定行一致性和列一致性,并且可以根据需要对矩阵进行置换以减少交叉。如果矩阵是行一致的和列一致的,并且在仅涉及平淡对的所有可能排列下都保持不变,则称该矩阵与E5一致。这样的一致性是最小化交叉的必要条件,但是还不够。 将给出一个例子来说明这种不足。

尽管严格地讲一致性是可能的,但是通常,仅对于生成5阶或更低阶的矩阵(如E的下标所示),该属性对于较大的矩阵仍然有用,并带有适当的附加条件,以反映这些较大的矩阵是不是良性的。

通过排列N来最小化交叉

假设N具有行置换集P和列置换集Q,它们分别表示适当索引集的某种顺序。令pi ∈ P,令Qi = {qi(u)}是Q的最大子集,使得
K ( p i , q i ( u ) ) = m i n k ( p i , q k ) K(p_i,q_i^{(u)}) = min_k(p_i,q_k) K(pi,qi(u))=mink(pi,qk)
对于所有的qk ∈ Q并且qi(u) ∈ Qi都成立的话,我们说pi映射为Qi

同样的,令qj∈ Q,令Pj ∈ {pj(u)}是P的最大子集,使得
K ( p j ( v ) , q j ) = m i n k K ( p k , q j ) K(p_j^{(v)},q_j) = min_kK(p_k,q_j) K(pj(v),qj)=minkK(pk,qj)
对于所有的pk ∈ P并且pj(u) ∈ Pj都成立的话,我们说qj映射为PJ

现在假设pi *和qj*是行和列的排序,它们产生的交叉次数最少。即K(pi *,qj*)= Kmin。从前面的讨论中应该清楚,以下两个定理是有效的:

Theorem 1: K(pi*,qk) = Kmin , where qk ∈ Qi.

Theorem 2: K(pk,qj*) = Kmin , where pk ∈ Pj.

现在我们定义集合S(pi) = ∪Pj(qj),在该集合上对所有qj ∈ Qi(pi)进行联合。我们说pi双重映射到S(pi)。然后直接从前面的定理得出以下结论成立:

Theorem 3: K(pi*,qj*) = Kmin 的必要条件是

a) qj*∈ Qi ,

b) 对于每个pμ ∈ S(pi*)都会双重映射到 S(pi*) .

此结果与(7)一起,提供了算法3的基础,该算法显示了如何找到在F(N)中找到的整个最小交叉矩阵集。

算法3:找到F(N)中最最小交叉矩阵集

  1. 从适当的互连矩阵N开始。

  2. 确定N的索引集的排列的半集P’(对应其较小维度),以使P’的任何成员都不是任何其他成员的反转。

  3. 对于每一个pi ∈ P’,确定其Qi。对于Qi中的每个排列qj,确定集合Pj

  4. 应用定理3寻找P中所有满足要求的成员。对于刚刚找到的子集的每个成员,选择其Q-set的一个成员并计算交叉计数。

  5. 从这组计算中,确定P’的哪些成员产生最小的交叉计数。 对于那些这样做的人,将它们与他们的Q-set成员配对,以获得置换族中最小交叉矩阵的一半。 这些中的每一个的旋转将产生置换族中最小交叉矩阵集的其余成员。

二进制矩阵的标准形式

如果层次结构的原始描述包括绕过级别的多个边,则需要用适当的描述替换该描述,如前面所述。结果是引入了新的顶点。通常,新顶点可以是“载体”顶点,即仅具有一个输入边缘和一个输出边缘的顶点。在互连矩阵中,这具有引入行或列或同时在行或列中仅包含单个1的情况。这样的行和列可能导致计算效率低下。 同样,如前所述,最小化过程不需要携带相同的行或相同的列。因此,给定互连矩阵N’,我们将N’的标准形式定义为矩阵N,使得

a) N’中的每组相同行(列)都用N中的代理替换,

b) 矩阵N是通过对N’进行置换而得出的,使得N可以以以下形式写
N = I ∅ ∅ X (8) N = \begin{matrix} I & \emptyset \\ \emptyset & X \end{matrix} \tag{8} N=IX(8)

其中I是单位矩阵,Ø是零矩阵,

c) 矩阵X没有用零填充的行或列

d) 如果矩阵X的行带有单个1,则包含1的列也具有附加的1。

显然,如果N是最小交叉点,则X也是如此,反之亦然。

同样清楚的是,如果(8)中的单位矩阵的尺寸为r x r,则通过简单地对I的行和列进行等距排列,即可获得r!个N’的标准形式版本。如果X连续的平淡对的有序行或列,则可以找到更多标准形式的版本。

考虑到与标准形式相关的计算优势,在应用算法3查找最小交叉矩阵时,仅仅需要检索互连矩阵X分量的最小内联,这将是有利的。

矩阵N的特殊实现

为了准备级联矩阵的研究,引入了矩阵N的特殊实现。 N的特殊实现总是可以用以下形式编写:
Γ ( N ) = P 1 N ∗ P 2 (9) Γ(N) = P_1N^*P_2\tag{9} Γ(N)=P1NP2(9)
其中P1和P2是置换矩阵,而N*是F(N)中的最小交叉矩阵。

算法4:特殊实现矩阵N的开发

下图说明了矩阵特殊实现的发展。(如果矩阵是置换矩阵,如果以标准形式放置,则(9)中的所有三个项将是单位矩阵。因此,特殊实现将被认为是不需要重重点关注的。)
在这里插入图片描述

地图终端

地图的顶层和底层顶点称为地图的终点。通常,对终端的顺序没有限制,因此,在像(9)这样的实现中,在实现的末端具有置换矩阵,可以将置换矩阵丢弃。 这是消除交叉的非常简单的方法。

如果(9)的特殊实现出现在更长的矩阵实现中,则通常必须保留(9)中的置换矩阵(而不是被丢弃)。

特殊实现的交叉计数

给定的矩阵N将具有几个特殊的实现,对应于几个最小交叉矩阵。如果特殊实现中的交叉总数少于矩阵N中的总数,将是令人愉快的,但不能保证会发生这种情况。但是,特殊的实现对于减少交叉计数很有用。如定理4和后续示例所示,置换矩阵引入的其他交叉不太可能在交叉减少的整个过程中保留。

间接实现三层制图

3级映射始终可以通过(1)中的直接实现来指定,形式为T(0) = N1N2。 实现中的交叉次数由K[T(0)] = K(N1) + K(N2)给出。 如果N1或N2都不是置换矩阵,则两者都有不平凡的特殊实现。 因此,总是可以写入 N1N2 = Γ1Γ2 = P1N1*P2P3N2*P4。 如果终端的顺序没有限制,并且我们定义P = P2P3,则可以通过简化表达式来实现3级映射的间接4级实现
T a ( 1 ) = N 1 ∗ P N 2 ∗ , T_a^{(1)} = N_1^*PN_2^*, Ta(1)=N1PN2,
并且地图中的交叉点数将为
K a = K [ T a ( 1 ) ] = K ( N 1 ∗ ) + K ( N 2 ∗ ) + K ( P ) . K_a = K[T_a^{(1)}] = K(N_1^*) + K(N_2^*) + K(P). Ka=K[Ta(1)]=K(N1)+K(N2)+K(P).
期望该表达式取正值。方括号中的项是固定的,因此减少项将完全取决于P的选择。因此,希望通过选择交叉很少的置换矩阵来使K§尽可能小。

因为在给定的置换族中始终至少有两个最小交叉矩阵,所以总是有可能找到至少三个N的间接四层矩阵实现。它们是
T b ( 1 ) = ( N 1 ∗ ) r P ′ N 2 ∗ T_b^{(1)} = (N_1^*)_rP'N_2^* Tb(1)=(N1)rPN2

T c ( 1 ) = N 1 ∗ P ′ ′ ( N 2 ∗ ) r T_c^{(1)} = N_1^*P''(N_2^*)_r Tc(1)=N1P(N2)r

T d ( 1 ) = ( N 1 ∗ ) r P r ( N 2 ∗ ) r T_d{(1)} = (N_1^*)_rP_r(N_2^*)_r Td(1)=(N1)rPr(N2)r

当P’ = ζnP,P’’ = Pζn,其中P的尺寸为n x n。这些都是基于(7)的实现。

现在由于Z§ = n(n-1) / 2,因此从(5)可以清楚地看到,如果K§ = K(Pr)超过n(n-1) / 4,则K(P’) = K(P’’) < n(n-1) / 4。因此,总是有可能选择四个4级间接实现中的至少两个,以使4级实现的交叉数不超过K(N1*)+ K(N2*) + n(n-1) / 4。可以用以下定理形式化。

Theorem 4:如果
{ [ K ( N 1 ) − K ( N 1 ∗ ) ] + [ K ( N 2 ) − K ( N 2 ∗ ) ] } > n ( n − 1 ) / 4 (10) \{[K(N_1) - K(N_1^*)] + [K(N_2) - K(N_2^*)]\} > n(n - 1) / 4\tag{10} {[K(N1)K(N1)]+[K(N2)K(N2)]}>n(n1)/4(10)
则总是可以发现乘积N1N2的4级间接实现比3级直接实现具有更少的交叉。

3级实现在此处采用的方法将在后续部分中扩展到e级实现。

矩阵因子

在上一节中,已经表明可以通过开发直接矩阵乘积的间接实现来减少交叉。 为此,引入了由诸如P1N* P2之类的形式组成的单个矩阵的特殊实现。这是矩阵分解的一种形式,通过将其指定为P-因子,可以与其他分解矩阵的方式区分开。P-因子由两个置换矩阵组成,该矩阵围绕着被分解矩阵族中的最小交叉矩阵。 公式里面除了因子的其他的都为值。

为了更详细地探讨因式分解的可能性,我们接下来考虑另外两种类型的矩阵因式分解。

c-因子

大型矩阵中的预期交叉次数大约随其度量的平方而变化。减少交叉的一种方法可能是尝试对矩阵进行因子分解,以使每个因子的度量小于原始度量。我们将说,当且仅当存在两个矩阵E和F使得矩阵N是可分解的

a) N = EF,

b) cE和cF均小于cN

如果N是可c-因子分解的,则其置换族F(N)的任何成员也是如此。 为了说明这一点,假设N是可c-因子分解的。然后存在满足条件a)和b)的矩阵E和F。现在让N’ ∈ F(N)。那么N’ = P1NP2,N’= P1EFP2 =(P1E)(FP2) = E’F’。由于矩阵的排列不会改变其度量,因此显然N’是可c-因子分解的

接下来,将证明以下定理的有效性。

Theorem 5: 鉴于N不是置换矩阵,始终可以将N分解为以下形式
N = α θ β (11) N = \alpha\theta\beta\tag{11} N=αθβ(11)
其中θ是置换矩阵,但α和β不是置换矩阵,并且K(θ)= K(N)和K(α) = K(β) = 0。

令N为尺寸为m x n且度量为cN的二进制矩阵。令N的行的度量为c1,c2, … ,cm(其中c0 = 0),令N的列的度量为d1,d2, … , dn(d0 = 0)。尺寸为m x cN的矩阵α的第i行的形成如下:

a) 首先,顺序小于等于(c0 + c1 + … + ci - 1)的填充0,

b) 接下来,填充ci个1,

c) 最后,剩下的全部用数字0填充构成cN数字行。

尺寸为cN x n的矩阵β的第j行的形成如下:

a) 首先,顺序小于等于(d0 + d1 + … + dj - 1)的填充0,

b) 接下来,填充dj个1,

c) 最后,剩下的全部用数字0填充构成cN数字行。

令尺寸为cN x cN的置换矩阵θ形成为块尺寸m x n,使得如果N的对应单元格包含1,则每个块子矩阵恰好包含单个1,其他单元格都用0填充,任何行或列都不能包含多个1。则θ的度量为cN

然后可以通过直接乘法证明满足(11)。为了确保K(θ) = K(N),对1比0的条目进行了进一步的限制。首先,从θ开始从左到右,出现在同一行块中的那些1必须位于该块内的连续较低行中。 其次,从θ开始从顶部到底部,在相同的列块中出现的那些1必须相继位于该块的右侧。

当满足上述所有条件时,我们说矩阵N以正常形式展开

优势

假设两行(列)r1和r2处于优势关系riDrj,条件是行r1包含了r2条目是1的单元格。如果两行(列)都具有1的数量为q,则优势被描述为q阶。如果riDrj和rjDri,则两行(列)相同;否则,优越是严格的(只能单方向优势)。

每个适当的互连矩阵都会在其行和列上引发主导结构。可以使用已建立的用于构造二元关系的方法来计算优势结构[1]。 例如,给定矩阵
N = a b c d e v 1 1 1 0 0 w 1 1 0 0 0 x 1 0 0 0 0 y 0 1 1 0 0 z 1 0 0 1 1 N = \begin{matrix} & a & b & c & d & e \\ v & 1 & 1 & 1 & 0 & 0 \\ w & 1 & 1 & 0 & 0 & 0 \\ x & 1 & 0 & 0 & 0 & 0 \\ y & 0 & 1 & 1 & 0 & 0 \\ z & 1 & 0 & 0 & 1 & 1 \\ \end{matrix} N=vwxyza11101b11010c10010d00001e00001
行和列的主导结构显示如下图
在这里插入图片描述

对于某些矩阵,主导结构是单层的,如下所示:
N = a b c v 1 1 0 w 1 0 1 x 0 1 1 N = \begin{matrix} & a & b & c & \\ v & 1 & 1 & 0 \\ w & 1 & 0 & 1 \\ x & 0 & 1 & 1 \\ \end{matrix} N=vwxa110b101c011
没有等效行或列且行和列均具有单级优势结构的适当矩阵称为核心矩阵。(所有置换矩阵都是核心矩阵。)

优势属性与矩阵的可分解性密切相关,如下一节所述。

Psi-因子

我们将说矩阵N是可ψ-因子分解,当且仅当存在两个矩阵A和B使得

a) N = AB,

b) K(A)和K(B)都是小于K(N)。

有了这个定义,我们可以立即显示以下定理。

Theorem 6: K(N) > 2的每个合适的二进制矩阵N是可ψ-因子分解的

Theorem 5和随后的讨论中可以知道,总是可以用(11)的形式写N
N = N 1 = α ( θ β ) = α G 1 N = N_1 = \alpha(\theta\beta) = \alpha G_1 N=N1=α(θβ)=αG1
其中K(α) = 0并且K(G1) = K(N)。现在,通过假设K(N) >= 2,因此必然在G1中有两个相邻的行产生单个交叉。因此,必然有一个置换矩阵P,使得N = αPTPG1 = (αPT)(PG1) = AB,其中PG1互换G1的两行,从而消除了它们产生的交叉。乘积αPT最多产生A优势的单个交叉,因为α的排列互换两列,每列包含单个1。因此,K(A) < K (N) 并且K(B) = K(N) - 1。建立Theorem 6

Theorem 7: 如果维数为m x n的适当矩阵N有任意两行(列)涉及2或更高阶的优势,则N是可c-因子分解的的最大尺寸不超过max(m,n)的因子,并且是置换的某个成员家庭F(N)是可ψ-因子分解的

为了证明这个结论,令riDrj等于2或更高,其中ri和rj是N的两行。然后N = AB其中A = I + Δ,并且Δ中除单元格(i,j)是1,其他的全是0; 其中B与N相同,只是B的第i行是ri - rj。那么A的度量为m + 1,B的度量小于或等于cN - 2。由于N是适当的,并且至少有两行包含至少两个1,所以cN >= m + 2。因此,cA和cB都小于cN,因此N是可c-因子分解的

显然,会有一些矩阵N’ ∈ F(N)使得rj和ri在N’中相邻。然后,刚刚描述的可c-因子分解的允许N’= A’B’,其中K(A’) = 0且K(B’) < K(N’),这足以表明N’是可ψ-因子分解的。类似的推导也适用于列优势。

Theorem 7中,总有可能将具有至少2阶优势的任何适当矩阵N分解为三个因子,形式为N = PN1N2(如果优势在行之间)或形式为N = N1N2P(如果优势在列之间),而无需增加层次结构的宽度。在任何一种情况下,置换矩阵都用于在矩阵进行ψ-因子分解之前将主导关系中涉及的两行或两列引入矩阵中。

这三个因素的交叉数量相加可以小于或大于矩阵N的交叉数目。但是,对于该方法可用于减少相交的情况,前者不必小于后者即可。

对于最小交叉矩阵,可以建立与ψ-因子分解有关的更强结果。 在进行此结果之前,我们建立一个相关引理。

Lemma: 令N*为最小交叉矩阵,形式为
N ∗ = [ V W X ] N^* = \begin{bmatrix} V \\ W \\ X \\ \end{bmatrix} N=VWX
其中V,W和X是三个子矩阵,并且W包含u + 1行:r1 = s, r2,r3, … , ru + 1 = t,其中k(s,t) > 0。然后

a) 子矩阵W至少包含u个交叉,或者

b) 还有另一个最小交叉矩阵N** ∈ Fr(N*)可通过N*的行置换获得,可以写成
N ∗ ∗ = [ V ′ W ′ X ] N^{**} = \begin{bmatrix} V' \\ W' \\ X \\ \end{bmatrix} N=VWX
W’的第一行和最后一行与W相同,W’包含v + 1行(v < u),并且W’至少包含v个交叉。

为了证明这一引理,请注意,如果W中除第一行s以外的每一行至少产生一个交叉,因为假设W中第i行(称作i)与t没有交叉,那么i一定与s有交叉;否则肯定i和t至少有一条交叉。因为存在u + 1行,所以一定至少会有u个交叉。然后a)将被满足。但是,如果W中有一些行在其上方的每一行形成平淡的对,则所有这些行都可以置换到子矩阵V’里面,而不会改变交叉的数量,仅留下W’中的s和那些与它上面的行产生至少一个交叉的所有行。因为k(s,t) > 0,肯定t会保留在W’中。然后将满足条件 b)。

鉴于上述引理,我们可以提出以下定理。

Theorem 8: 如果尺寸为m x n的适当矩阵N具有任意两行(列),且涉及q = 2或更高阶的优势,则存在一个最小交叉矩阵N* ∈ F(N),可将ψ-因子分解分解为最大尺寸为不超过max(m,n)。

为了证明这个定理,我们假设矩阵N*可以写成
N ∗ = [ V W X ] N^* = \begin{bmatrix} V \\ W \\ X \\ \end{bmatrix} N=VWX
W中的第一行s优势于W中的最后一行t,并且交叉数K(W)至少为u,W的行数是u + 1。引理表明,只要主导行位于其支配行的上方,此假设(对于行支配性)不会涉及任何一般性损失。

然后可以将N*分解为乘积N* = AB,其中A = I + Δ,其中Δ中的每个元素都为0,但对应于N*的一对行(s,t)的单元格中的条目除外是1。那么A中的交叉数将是u - 1,因此K(A) < K(N*)。矩阵B与N*相同,只是N*的行s被替换为s - t,于是K(B) < K(N*)。

如果支配对(s,t)的顺序颠倒,则可以将相同的参数应用于N*的旋转。 当优势在列之间时,适用类似的论点。

矩阵实现

矩阵实现构成地图构建的基础。如前所述,可以通过检查适当的系统结构矩阵来获得直接矩阵实现,并且可以将其写为
T ( 0 ) = N 1 N 2 . . . N l − 1 (12) T^{(0)} = N_1N_2 ... N_{l - 1}\tag{12} T(0)=N1N2...Nl1(12)
对应于结构中具有l个级别的地图。

通过减少穿越次数来提高地图可读性的通用方法包括用在某些方面优于它的另一种实现替换T。

我们可以将Y(T)指定为矩阵实现的族(不一定具有相同的参数),所有这些都具有一个共同点,即它们保留了由T(0)表示的顶点和路径。 实现可能在级别数,顶点数,边数,交叉数,关联地图的宽度以及级别内顶点的顺序方面有所不同。然后,将T(0)转换为Y(T)的其他成员可以改进实现。

交叉实现

T(0)中的各个矩阵本身可能具有不同的矩阵实现。假设,例如,矩阵N;具有形式Pa(i)tiPb(i)的实现。然后,将此类表达式进行级联,并适当组合相邻置换矩阵,并去除末端置换矩阵,可以生成以下形式的表达式
T ′ = t 1 P 1 t 2 P 2 . . . P l − 2 t l − 1 (13) T' = t_1P_1t_2P_2...P_{l-2}t_{l-1}\tag{13} T=t1P1t2P2...Pl2tl1(13)
表示Y(T)的某个成员,其中Pj是位于T’中tj和tj + 1之间的置换矩阵。如果ti本身是多个矩阵的乘积,则其最终矩阵将不是(13)中的置换矩阵。

如果(13)中的ti,包含一个或多个内部置换矩阵,则可以进一步详细说明以形成比(13)更长的表达式,其中,每个置换矩阵都分别进行了详细说明,但所有其他连续乘积都集中在t表示法中 。

我们称这种形式(13)的实现,其中t都不包含任何置换矩阵作为因子作为交替实现。

可以使用前面讨论的方法来找到T(0)中各个矩阵的实现,即找到要在(13)中使用的t。例如,可以使用下图算法6所示的方法,如先前在特殊情况下所示。在路由实现中使用i因子也可能是合适的。无论使用哪种方法来实现交替实现,通常都可以使用下面将要描述的旋转方法来获得改进的实现。
在这里插入图片描述
算法描述:

  1. 找到直接矩阵的直接实现
  2. 查找每个分量矩阵的特殊矩阵实现
  3. 从特殊实现到新的实现
  4. 删除终端置换矩阵
  5. 将相邻的置换矩阵相乘得到单个置换矩阵以获得交替实现
  6. 从T(1)吸收唯一矩阵

旋转

在定理4中表明,只要存在包括两个非置换矩阵和一个置换矩阵的交替实现,如果置换矩阵中的交叉数超过Z§/2,就有可能减少交叉。以交替形式放入矩阵实现中完成此操作的一般过程称为旋转。下图中的算法7示出了一般过程。

在这里插入图片描述

举例

对于一下的间接矩阵实现:
T ′ = [ 1 1 0 1 0 1 0 0 1 ] [ 0 0 1 0 1 0 1 0 0 ] [ 1 1 0 1 0 1 0 0 1 ] [ 0 1 0 0 0 1 1 0 0 ] [ 1 1 0 1 0 1 0 0 1 ] T' = \begin{bmatrix} 1 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} 1 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} 1 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 0 & 1 \\ \end{bmatrix} T=110100011001010100110100011001100010110100011
映射出现在下图当中。由于每个置换矩阵都是3 x 3,因此对于每个Z =3。每个交叉矩阵的数量超过Z的一半,因此,可以按照前面所述的方式进行处理。旋转此实现的一种简单方法是将其替换为实现
T ′ ′ = ( ζ 3 t 1 ζ 3 T ) ( ζ 3 P 1 ) ( t 2 ) ( P 2 ζ 3 ) ( ζ 3 T t 3 ζ 3 ) = ( t 1 ) r ( ζ 3 P 1 ) ( t 2 ) ( P 2 ζ 3 ) ( t 3 ) r . T'' = (ζ_3t_1ζ_3^T)(ζ_3P_1)(t_2)(P_2ζ_3)(ζ_3^Tt_3ζ_3) \\ =(t_1)_r(ζ_3P_1)(t_2)(P_2ζ_3)(t_3)_r. T=(ζ3t1ζ3T)(ζ3P1)(t2)(P2ζ3)(ζ3Tt3ζ3)=(t1)r(ζ3P1)(t2)(P2ζ3)(t3)r.
这保证了由于置换矩阵而导致的交叉将减少,而由于其他矩阵而导致的交叉将保持不变,从而实现了
T ′ ′ = [ 1 0 0 1 0 1 0 1 1 ] [ 1 0 0 0 1 0 0 0 1 ] [ 1 1 0 1 0 1 0 0 1 ] [ 0 1 0 1 0 0 0 0 1 ] [ 1 0 0 1 0 1 0 1 1 ] T'' = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 1 & 0 \\ 1 & 0 & 1 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ \end{bmatrix} T=110001011100010001110100011010100001110001011
在这里插入图片描述

吸收性

在旋转操作结束时,可能发生置换矩阵可以乘以其相邻矩阵之一的情况。这样的效果可能是减少交叉的数量以及等级的数量。在这种情况下,我们说吸收排列矩阵是适当的。在前述示例中,第二矩阵和第四矩阵均可被吸收。可以将T’'中的第三和第四矩阵相乘,从而消除2个交叉和1个水平。

在前面的示例中,各个互连矩阵最初并未设置为最小交叉形式。可以对T’'中的最后一个矩阵进行列置换以使其成为最小交叉形式,如果最终顺序不重要,则可以省去最终的置换矩阵。在这些更改之后,结果是只有一个交叉和四个级别;即
T 3 = [ 1 0 0 1 0 1 0 1 1 ] [ 1 1 0 0 1 1 0 0 1 ] [ 1 0 0 1 1 0 0 1 1 ] T^3 = \begin{bmatrix} 1 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 1 & 1 & 0 \\ 0 & 1 & 1 \\ \end{bmatrix} T3=110001011100110011110011001
第一个矩阵与E3行一致,但与E3列不一致。但是,它仅包含1个交叉,并且任何置换都会在置换矩阵中引入一个交叉来跟随它。

如果“个体矩阵实现ti是最小交叉实现”,则它们在发生旋转时保留该属性。但是,仍然可以通过以刚才说明的方式吸收置换矩阵,同时保持相交数不变来减少层次数。 如果为任意两个级别之间的交叉数设置阈值,则可以通过吸收来减少级别数,同时允许交叉数向允许的阈值增加。 如下所述,也可能利用平淡的对来减少置换矩阵中的交点。

使用“平淡”来减少穿越

任何置换矩阵族中的最小交叉矩阵是没有交叉的恒等矩阵。因此,随着根据ψ-因子分解的置换矩阵的建立,除非它们是恒等矩阵,否则它们将永远不会成为最小交集。可能会出现排列矩阵,可以减少交叉。

特别地,如果在矩阵实现中与置换矩阵相邻的矩阵具有平淡的行或列对,并且如果置换矩阵中的对应行或列产生相交,则会发生这种情况。

下图的算法8示出了一种检查交替矩阵实现以确定是否存在任何这种可能性并进行可能的改变的方式。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值