在计算分子生物学中有种系发生树的概念。也许读者不知道这些具体的术语,不要紧。我们还是建立数学模型吧。
对于性状和对象构成的二值矩阵M如下:
c1 c2 c3 c4 ... c(n)
o1 1 0 1 ......
o2
o3
....
o(m)
若矩阵M(i, j)为1,则说明对象O(i)具有性状j。
现在若该矩阵含有完全种系树,那么从矩阵M中任意取两列,则要么这两列为包含关系,要么为不相交关系。
现在请给出算法,判断一个矩阵是否含有种系完全树。
也许看到这个问题,大家都有思路,只需要三层循环就搞定了,其时间复杂度为O(n ^ 2 * m)
现在我们来想是否存在O(n * m)的算法呢?答案是存在。
既然存在,我应该怎么做呢?
o1 o2 o3 o4 o5 .... o(n)
c1
c2
..
c(m)
我要将矩阵M转置为矩阵N。
算法的伪代码为:
Initialize L[m][n]为0
for i = 1 to m
k = -1;
for j = 1 to n
if(N[i][j])
L[i][j] = k;
k = j;
end
end
for i = 1 to n //按列进行查找
if exists j,l s.t. L[l][i] 和L[j][i]都不为0,且还不相等,ruturn false (复杂度为O(m * n))
return true;
整个复杂度为O(m * n).