这是我在编程竞赛中遇到的一个有趣的问题:
问题陈述:给定n
矩阵的维度,确定是否存在可以乘以矩阵的排序。如果存在,则打印出所得矩阵的大小(维度的乘积)。
我的观察结果:如果将每个矩阵视为一个顶点并在可以乘法的矩阵之间绘制有向边,则会减少到NP完全哈密顿路径问题。我通过简单的强制解决问题解决了这个问题,但这显然非常缓慢。我想知道这个特定的问题实例是否有任何聪明的优化。
答案 0 :(得分:14)
为每个维度长度创建一个节点。也就是说,如果有一个维度矩阵(m,n),那么m和n将是图中的顶点。
对于每个大小(m,n)的矩阵,将节点m和n连接到有向边(两个节点之间可以有多个边)。
现在找到一个eularian路径会给出乘法顺序。
请参阅http://en.wikipedia.org/wiki/Euler_path查找Eularian小径。复杂度非常接近线性(O(nlog ^ 3n loglogn),其中n是边数=矩阵数)。
答案 1 :(得分:0)
创建一个兼容性矩阵(让我们称之为CM),如果矩阵x可以多次乘以y,则为CM [x,y] = 1,否则为0。 如果行列式(CM)<> 0有订单。
这只是一种直觉,如果我错了,我道歉(遗憾的是我找不到可靠的证据)。