背景:
首先来看一个矩阵:
一般用行列坐标[a,b]的形式表示矩阵中元素的位置:
前面的表示行(a),后面的表示列(b),也就是[1,2]表示第1行,第2列
根据行优先的原则,其排序方式为
根据列优先的原则,其排序方式为
列优先和行优先在实际应用中有什么意义?
行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,行/列优先对取数据有影响,如果程序取数据时地址内存时连续的那么就会快,因此当编译器取数组的值时是从列优先取的话,尽量取的时候也是按列优先取(根据编译器)——
(因为对于一个程序来说,数据必须一个个取,如果想缩短取这些数据的时间,那么就可以缩短数据存的距离,换句话说,我取完这一个,下一个数据最好就在它的隔壁,指针就不用跳来跳去)
举个很简单的例子:
我需要对二维数组 [[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,这就叫按行优先读取,如果编译器是按行存的话,速度比第一种读取快。
也就是谁是内循环就是先读谁。
关于多维数组行列优先的题目
(题目中的数组A也可以写成A[m][n])
记住这点!!所有的数组后跟两个字母的,都是前面的代表行,后面的代表列
m代表有m行
n代表有n列
i代表第i+1行(因为数组下标是从0开始)
j代表第j+1列
记住这个矩阵!!但是!!要注意一点!计算的时候要把当前行去掉!
最后结果也就是i*n+j(如果是按行存储的话)
总结:记住两点就可以应付这些题目了