多维数组的行列优先

背景:

首先来看一个矩阵:

图1

一般用行列坐标[a,b]的形式表示矩阵中元素的位置:
前面的表示行(a),后面的表示列(b),也就是[1,2]表示第1行,第2列

根据行优先的原则,其排序方式为


图2

根据列优先的原则,其排序方式为


图3

列优先和行优先在实际应用中有什么意义?

行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,行/列优先对取数据有影响,如果程序取数据时地址内存时连续的那么就会快,因此当编译器取数组的值时是从列优先取的话,尽量取的时候也是按列优先取(根据编译器)——

(因为对于一个程序来说,数据必须一个个取,如果想缩短取这些数据的时间,那么就可以缩短数据存的距离,换句话说,我取完这一个,下一个数据最好就在它的隔壁,指针就不用跳来跳去)

  • 举个很简单的例子:

    我需要对二维数组 [[1,2,3,4,5],[6,7,8,9,10]] 进行遍历,
    二维数组

    有两种方法:
//第一种
for(int i = 0;i < 5;i++){
  for(int j = 0;j < 2;j++){
    System.out.print(array[i,j]);
  }
}
//第二种
for(int i = 0;i < 2;i++){
  for(int j = 0;j < 5;j++){
    System.out.print(array[i,j]);
  }
}

第一种列是内循环,行是外循环,那么读取的时候就是,1,6,2,7,3,8,4,9,5,10,这就叫按列优先读取,如果编译器是按列存的话,那么速度会比第二种快。
第二种行是内循环,列是外循环,那么读取的时候顺序就是,1,2,3,4,5,6,7,8,9,10,这就叫按行优先读取,如果编译器是按行存的话,速度比第一种读取快。

也就是谁是内循环就是先读谁。

关于多维数组行列优先的题目

图4

(题目中的数组A也可以写成A[m][n])
记住这点!!所有的数组后跟两个字母的,都是前面的代表行,后面的代表列
m代表m行
n代表n列
i代表i+1行(因为数组下标是从0开始)
j代表j+1列
图5

记住这个矩阵!!但是!!要注意一点!计算的时候要把当前行去掉!
最后结果也就是i*n+j(如果是按行存储的话)

总结:记住两点就可以应付这些题目了

你可能感兴趣的:(多维数组的行列优先)