现在的位置: 首页 > 综合 > 正文

二值矩阵是否有完全种系树

2014年03月05日 ⁄ 综合 ⁄ 共 576字 ⁄ 字号 评论关闭

 

      在计算分子生物学中有种系发生树的概念。也许读者不知道这些具体的术语,不要紧。我们还是建立数学模型吧。

对于性状和对象构成的二值矩阵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).

吐舌头

抱歉!评论已关闭.