一种连续1矩阵的转换方法与流程

文档序号:12887140阅读:424来源:国知局

本发明涉及一种连续1矩阵的转换方法,更具体的说,尤其涉及一种的连续1矩阵的转换方法。



背景技术:

0/1矩阵为一个矩阵,其元素只能为0或者为1。具有连续1特性的0/1矩阵为一个0/1矩阵,且矩阵中每行的所有1是连续的。本文献中把具有连续1特性的0/1矩阵简称为连续1矩阵。现有的连续1矩阵相关方法存在只支持检测而不支持转换的问题。

文献1:j.tanandl.zhang.theconsecutiveonessubmatrixproblemforsparsematrices.algorithmica,48(3):287-299,2007。证明了给定一个0/1矩阵,从中提取出最大的一个子矩阵,使得这个子矩阵是连续1矩阵是一个np问题。文献1还提出一个近似算法,该算法能在多项式时间内提取一个极大的子矩阵,使得这个子矩阵是连续1矩阵。这个方法是多项式时间的,并且在只有两行三列的矩阵上的近似度是0.8。然而文献1所提出的方法只适用于非常小的矩阵。

文献2:k.s.boothandg.s.lueker,testingoftheconsecutiveonesproperty,intervalgraphs,andgraphplanarityusingpq-treealgorithms,j.comptr.syst.sci.13,3(1976),335-379。提出了一个能在线性时间内检测一个0/1矩阵是不是连续1矩阵的算法。该算法利用了pq树。然而该算法非常复杂,很难实现。

文献3:w.-l.hsu.asimpletestfortheconsecutiveonesproperty.j.algorithms,43(1):1-16,2002。提出了一个新的能在线性时间内检测一个0/1矩阵是不是连续1矩阵的算法。该算法基于行分割的方法。每一个分割段内的行允许列重排序后满足连续1特性。然而,该方法只支持连续1矩阵的检测,而不支持将一个非连续1矩阵转换为一个连续1矩阵。



技术实现要素:

本发明为了克服上述技术问题的缺点,提供了一种连续1矩阵的转换方法。

本发明的连续1矩阵的转换方法,其特征在于,转换方法为:首先将待转换的矩阵按照“含有1多的行在前、含有1少的行在后”的方法进行排序,然后以待转换矩阵的首行为参照,在其余各行中筛选出与首行不存在1元素所在行列为相同列的行,并将筛选出的行与首行组成新矩阵;然后,将待转换矩阵中已选出的行去除,对剩余的行继续按照前述方法进行刷选,直至待转换矩阵为空;最后,按照后一次形成的新矩阵放到前一次新矩阵右下角且空缺位用0填充的方式形成转换后的连续1矩阵。

本发明的连续1矩阵的转换方法,依次通过以下步骤来实现:

a).矩阵排序,待转换的0/1矩阵记为m,矩阵m的行元素和列元素数目均为n;将m的行根据其含有1的数目进行排序,含有1多的行在前、含有1少的行在后;排序后的矩阵仍记为m,如下所示:

b).标记含1最多的行,含有1元素最多的行记为r,则r=m[0],m[0]表示矩阵m的第0行;由r构成的矩阵记为r,则r=[r];

c).判断1所在列是否存在交集,检查m的第1行至最后一行,记当前行为m的第i行,即m[i];判断m[i]中1所在的列与r中各行的1所在的列是否不存在交集,如果不存在交集,则将m[i]作为新的一行加入矩阵r;

d).判断每行的1是否连续,判断矩阵r中每行中的1是否连续,如果不连续,则通过对调相应的列达到矩阵r中每行中的1连续的目的,并对对调操作进行记录;

e).矩阵串联,令矩阵k=k串联r,k的初始值为空,k串联r的含义为把r放到k的右下角,空缺位用0补齐;

f).去除已添加行,将矩阵m中添加至矩阵k中的行去除,即令m=m-r;执行步骤g);

g).判断矩阵是否为空,判断矩阵m是否为空,如果为空,则矩阵k即为m转换后的连续1矩阵,如果m不为空,则执行步骤b)。

本发明的有益效果是:本发明的连续1矩阵的转换方法,首先将待转换的矩阵按照“含有1多的行在前、含有1少的行在后”的方法进行排序,然后以待转换矩阵的首行为参照,在其余各行中筛选出与首行不存在1元素所在行列为相同列的行,并将筛选出的行与首行组成新矩阵;然后,将待转换矩阵中已选出的行去除,对剩余的行继续按照前述方法进行刷选,直至待转换矩阵为空;最后,按照后一次形成的新矩阵放到前一次新矩阵右下角且空缺位用0填充的方式形成转换后的连续1矩阵,解决了连续1矩阵相关方法存在只支持检测而不支持转换的问题。

具体实施方式

下面结合实施例对本发明作进一步说明。

给定待转换的0/1矩阵m,如下所示。

m不能直接转化为连续1矩阵。按照本发明提出的算法将m转化为连续1矩阵步骤如下。

第一步:找出1的数目最多的行,因为m的所有行都有两个1,则取m第0行。设置r={m[0]}。

第二步:检查m的其他行。发现第1行m[1]不可以加入r,因为m[0]和m[1]的第3列元素同时为1,即m[0]和m[1]所组成的矩阵不是连续1矩阵。

发现第2行m[2]可以加入r,因为m[0]和m[2]的1所在的列没有交集。此时r={m[0],m[2]}。

发现第3行m[3]不可以加入r,因为m[0]与m[3]的第2列元素均为1,同时m[2]与m[3]的第0列元素也同时为1。则第一次循环结束,得到一个连续1子矩阵k1如下:

第三步:开始第二次循环,此时m只剩下原来的第1行和第3行。首先设置r={m[1]}(此时,如果将m中剩余的两行元素重新分别定义为第0行、第1行,则r={m[0]})。发现第3行可以加入r,因为m的第1行和第3行的1所在的列没有交集。因此r={m[1],m[3]}。第二次循环结束,得到一个连续1的子矩阵k2如下:

此时k2在形式上每行的1还不是连续的,我们通过交换相应的列(将第1列与第2列进行交换),将其转化为每行均为连续1的矩阵。即把第1列和第2列交换,如下:

注意,k3的列标发生了变化,需要用一个map来记录。

最后把k3串联到k1的右下角,如下

为了更清晰的显示k3是在k1的右下角,本例子省略了空白位置的0。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1