`
frank-liu
  • 浏览: 1665554 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

矩阵的对角遍历分析

 
阅读更多

问题简介:

    以对角线的方式从左至右或者从右至左的遍历一个矩阵。这个矩阵更确切的说是一个行和列都长度相等的方阵。比如说,我们按照从左到右,从上到下的方式遍历一个矩阵。如下图所示:

那么我们遍历的序列将如下:1, 2, 5, 3, 6, 9 4, 7, 10, 13, 8, 11, 14 12, 15, 16.

这是一个比较常见的问题。以前在一些面试中也碰到过。一般来说,只是顺序的遍历每行每列显得过于简单。而通过对角访问的时候,我们可以看到,对应要遍历的行数为矩阵行数的2倍减1.

 

问题分析:

方法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]

经过前面的讨论,我们可以得出如下部分的代码:

 

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维的矩阵,然后从左到右按列遍历矩阵就实现了同样的效果。根据这种思路,得到的代码如下:

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++)
	{
		for(int j = 0; j < b.length; j++)
		{
			if(b[j][i] != 0)
				System.out.print(b[j][i] + " ");
		}
		System.out.println();
	}
}

这种方式遍历的时候我们需要有一个假定,就是假设我们我们新构造的矩阵中,新增加的元素必须和原来矩阵中的元素不一样。否则按列遍历的时候会产生混淆。这里只是简单的用0来表示。具体实现的时候需要根据情况来调整。

总结:

        矩阵对角遍历的两种方法中,第一种方法的要点在于要根据遍历的顺序和方向来推断矩阵元素下标的变化规律。有时候找到这些规律会比较费时间一点。第二种方法则比较简单直观一些,首先推断出行之间元素的位置偏移,然后构造一个对应的偏移矩阵。这种方法的好处就是不需要费脑筋去推算下标变化的关系,之需要构造出来然后遍历就可以了。当然,这样做比较费空间,同时也需要保证元素的独特性以防止遍历的时候产生混淆。

  • 大小: 14.7 KB
  • 大小: 12.5 KB
分享到:
评论

相关推荐

    python 实现方阵的对角线遍历示例

    对一个方阵矩阵,实现平行于主对角线方向的对角线元素遍历。 从矩阵索引入手: [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15] [16 17 18 19 20] [21 22 23 24 25]] 上三角的索引遍历: 0 0 1 1 2 2 3 3 4 4 0...

    TanaStudy#java-study#Q498对角线遍历1

    给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。示例 1:输出:[1,2,4,7,5,3,6,8,9]示

    托普利茨矩阵(遍历比较)1

    示例 1:解释:在上述矩阵中, 其对角线为:"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]

    python实现二维数组的对角线遍历

    本文实例为大家分享了python实现二维数组的对角线遍历,供大家参考,具体内容如下 第一种情况:从左上角出发,右下角结束 要完成的事情,就像下图: 话不多说,直接上Python实现代码与结果展示: # 输出遍历的索引...

    C语言判断是否为上三角矩阵

    C语言判断是否为上三角矩阵 在这个例子中,我们定义了一个3x3的矩阵,并通过...要判断一个矩阵是否为上三角矩阵,我们需要遍历矩阵的所有元素,如果发现某个元素不在主对角线或其以下的位置,则该矩阵不是上三角矩阵。

    python 实现矩阵按对角线打印

    将一个矩阵(二维数组)按对角线向右进行打印。(搜了一下发现好像是美团某次面试要求半小时手撕的题) Example: Input: [ [1,2,3,4], [5,1,2,3], [9,5,1,2] ] Output: [[4], [3, 3], [2, 2, 2], [1, 1, 1], [5, 5],...

    判断一个矩阵是否为上三角矩阵.pdf

    函数通过两个嵌套的循环遍历矩阵的下三角部分(即主对角线以下的元素),如果发现任意一个元素不为零,则说明矩阵不是上三角矩阵,返回 0。如果遍历完所有下三角元素都为零,则说明矩阵是上三角矩阵,返回 1。 在 `...

    1.8编程基础之多维数组(25题)

    2018/06/09 周六 20:15 623 02同行列对角线的格子.cpp 2018/06/09 周六 20:31 295 03计算矩阵边缘元素之和.cpp 2018/06/09 周六 21:21 667 04错误探测.cpp 2018/06/09 周六 21:24 870 05计算鞍点.cpp 2018/06/09 ...

    数据结构基础复习题

    已知某项工程对应的AOE网G有6个顶点(顶点编号为0~5),其邻接矩阵A为上三角矩阵(对角线全为零时,不存储其对应的权值),按行优先保存在如下的一维数组中。要求: 写出G的邻接矩阵。 (1)画出此工程对应的有向...

    matrix-paths:二维网格的简单深度优先遍历

    矩阵路径 二维网格的简单深度优先遍历 从左上角开始 2x2 对角线 6 ways to traverse! 2x2 从左上角简单 2 ways to traverse

    matlab代码循环运行-SparseMatrix:在Matlab中实现稀疏矩阵的存储和运算

    通过两个for循环,其中一个for循环对行遍历,然后第二个for循环对该行非零元素(含对角元)进行遍历。假设每行非零元分布大体均匀,于是时间复杂度为$O(n\times \frac{N}{n}) = O(N)$,考虑极端情况,时间复杂度为$O(n\...

    南京邮电大学通达学院matlab 仿真 蚁群算法 代码+报告

    但需要注意的是,这样计算出的矩阵对角线上的元素为0,然而为保证启发函数的分母不为0,需将对角线上的元素修正为一个足够小的正数。从数据的数量级判断,修正为以下,我们认为就足够了。 (3)初始化参数 计算之前...

    数据结构实验

    如何计算一个三元组表表示的稀疏矩阵对角线元素之和以及两个三元组表表示的稀疏矩阵的乘积? 实验5:二叉树的建立及遍历 (第十三周星期三7、8节) 一 、实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。...

    数据结构课程设计-C++实验代码

    能对对称矩阵和对角矩阵进行压缩存储 具体如下: 1. 能用一维数组根据矩阵中非零元素进行压缩存储 2. 能根据非零元素和对于重复元素只输入一次时要求能够构造出矩阵 3. 输入任意合法的行列下标能够得到它在...

    kruskal算法求最小生成树

    深度遍历图并用kruskal算法求最小生成树

    数据结构课程设计

    6、八皇后问题:设8皇后问题的解为 (x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。要求用一位数组进行存储,输出所有可能的排列。 7、迷宫求解:用二维...

    Arrays-DoublePointers:数组以及数组中使用双指针技巧

    给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素。 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,4,7,5,3,6,8,9] 解决该题,只需要仔细观察出...

    数据结构算法实现(严蔚敏版配套实现程序)

    1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ...

    leetcode二维数组-leetcode:我的LeetCode记录

    leetcode二维数组力码 我的 LeetCode 记录 561.阵列分区I(2018.3.15 ...如果从左上角到右下角的每个对角线都具有相同的元素,则矩阵是 Toeplitz。 现在给定一个 M x N 矩阵,当且仅当矩阵是 Toeplitz 时才返回

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    7.3.3 三对角矩阵 7.3.4 三角矩阵 7.3.5 对称矩阵 7.4 稀疏矩阵 7.4.1 基本概念 7.4.2 用单个线性表描述 7.4.3 用多个线性表描述 7.4.4 性能测量 第8章 栈 8.1 定义和应用 8.2 抽象数据类型 8.3 数组描述 8.3.1 作为...

Global site tag (gtag.js) - Google Analytics