网站大量收购闲置独家精品文档,联系QQ:2885784924

7.矩阵的对角遍历分析.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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)

ldj215322 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档