- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7.矩阵的对角遍历分析
矩阵的对角遍历分析
问题简介:
? ? 以对角线的方式从左至右或者从右至左的遍历一个矩阵。这个矩阵更确切的说是一个行和列都长度相等的方阵。比如说,我们按照从左到右,从上到下的方式遍历一个矩阵。如下图所示:
那么我们遍历的序列将如下:1, 2, 5, 3, 6, 9 4, 7, 10, 13, 8, 11, 14 12, 15, 16.
这是一个比较常见的问题。以前在一些面试中也碰到过。一般来说,只是顺序的遍历每行每列显得过于简单。而通过对角访问的时候,我们可以看到,对应要遍历的行数为矩阵行数的2倍减1.
?
? ? 以前面的问题为例,粗看如果要遍历对角的数据,需要首先从第一行开始,每一次找到在它左下角方向的元素,也就是假定取第一行的元素a[0][j],则对应该序列后面的元素分别为a[1][i - 1], a[2][i-2]...a[i][0]。这样我们就遍历完了上面一半的内容,一直到右上到左下的对角线。
? ? 遍历完了这部分之后我们就要从第一行的最后一列开始,一直到最右下角。每个序列每次行号增加1,列号减1,一直增加到最后一行。生成的序列应该类似如下:a[1][n-1], a[2][n-2]...a[n-1][1]
经过前面的讨论,我们可以得出如下部分的代码:
?
Java代码??
public?static?void?traverseNoCopy(int[][]?a)??
{??
????//?Traverse?the?upper?part??
????for(int?j?=?0;?j??a[0].length;?j++)??
????{??
????????for(int?k?=?0;?k?=?j;?k++)??
????????{??
????????????System.out.print(a[k][j?-?k]?+??);??
????????}??
????????System.out.println();??
????}??
??
????//?Traverse?the?lower?part??
????for(int?i?=?1;?i??a.length;?i++)??
????{??
????????for(int?j?=?i;?j??a.length;?j++)??
????????{??
????????????System.out.print(a[j][a.length?-?j?+?i?-?1]?+??);??
????????}??
????????System.out.println();??
????}??
}??
?这个遍历的过程中,最难的地方是这个矩阵的遍历要分成两块,上面部分对应的二重循环中两个下标的关系和下面部分的不一样。要找到对应的关系则需要列出几个元素的序列来寻找其中的规律。
?
?方法2:
? ? ? ? 和方法1比起来,这种方法需要占用额外的空间,但是相对来说更容易理解一点。我们看前面的矩阵图。当我们要从右上到左下遍历的时候,对应这个元素下面一行的元素是在它对应列元素左边一个。后面的元素依次类推。那么,既然如此,如果我们将每一行元素下面一行的元素依次向右移动一位,那该如何呢?这样,将构成一个如下图的样子:
?
? ? ? ? 一个有意思的地方就是,原来我们需要斜角去访问的地方,现在只需要逐列的访问就可以了。为了实现这么一个结构,我们需要额外构造一个2n -1维的矩阵,然后从左到右按列遍历矩阵就实现了同样的效果。根据这种思路,得到的代码如下:
Java代码??
public?static?void?traverse(int[][]?a)??
{??
????//?Suppose?we?traverse?from?left?to?right?and?from?upper?right?to?lower?left??
????int[][]?b?=?new?int[a.length?*?2?-?1][a.length?*?2?-?1];??
??
????//?Copy?every?row?in?a?and?make?some?offset?accordingly??
????for(int?i?=?0;?i??a.length;?i++)??
????{??
????????for(int?j?=?0;?j??a.length;?j++)??
????????{??
????????????b[i][i?+?j]?=?a[i][j];??
????????}??
????}??
??
????//?Traverse?every?column?from?left?to?right??
????for(int?i?=?0;?i??b.length;?i++)??
????{??
?????
文档评论(0)