二维数组用一维数组的方式表示

二维数组a[i][j]表示为一维数组:

  • 行优先原则:a[i*M+j] i是行下标,M是一行的元素个数,j是列下标
  • 列优先原则:a[i*M+j] i是列下标,M是一列的元素个数,j是行下标

扩展:

1、如何获取固定形状的二维数组的长和宽?

matrix[][]; // 假设已定义
int m = matrix.length; //矩阵的行长度
int n = matrix[0].length; //矩阵的宽长度

2、问题:若二维数组元素按行优先存储,则有以下两种方式访问数组,

        a. 按行访问数组,即一行一行访问数组

        b. 按列访问数组,即一列一列访问数组

那么请问a和b两种方式哪种访问的速度快?

先说答案,第一种。

原因分析:

先说说程序访问的局部性原理,包括时间局部性和空间局部性。

  • 时间局部性是指在最近的未来要用到的信息,很可能是现在正在使用的信息,因为程序中存在循环。
  • 空间局部性是指在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放,顺序执行的,数据一般也是以向量、数组等形式聚集地存储在一起的。

了解了上面的原理,相信你应该也知道了答案。a之所以比b快的原因便是a的空间局部性比b好。(因为a的访问顺序与存放顺序是一致的,按行存储,按行访问)。从而导致执行的时间不同。数据越大,时间相差越明显,大家也可以自行编写代码运行一下!!

如果觉得有帮助可以点个赞支持一下呀。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值