多维数组存储的两种方式
1 数组存储的要求
数组存储的要求:连续存储。
连续:数组的n个元素对应n(或n+1)个内存地址,两相邻元素的地址相邻。
相邻元素:对于一维数组来说,相邻元素没有多大的选择,就是下标差绝对值为1的两元素;对于二维及以上的数组来说,以最左(右)下标为个位,次左(右)下标为十位…所组成的数字,相邻元素是下标差绝对值为1的两元素。
同一区域的内存都是连续的,不存在形象的矩阵等型。在存储了数组的首地址后,按照何种方式存下一个临近的元素是某种语言规定或编译器内部代码所决定的。也就是说,一旦选择了在某个平台下编写程序,咱所定义的数组的存储方式已定。
那么,对于一个应用开发者来说,此笔记记录数组的存储方式由显多余(用不到呀)。除非开发者是在编写编译器规定数组存储部分的代码。并非绝对没有用,探究数组的存储方式亦可练习一下思维,积累一下在方法方面的经验。
2 数组存储的方式
数组作为一种构造型的数据类型,好歹也被看作一种数据结构。数组的存储方式需要满足数组存储的要求。对于一、二数组来说,书中所述的以行优先、列优先方式存储比较明显,因为数组可以对应成较简单相应的的模型,二维数组可以看成二维矩阵,从而整个分析过程较简单,不再笔记。
(1) 多维数组左下标优先的存储方式n>2
所谓左下标优先存储是指按以下过程存储(跟书中所述行优先存储一个样,多维下我想不出哪个下标是行,哪个下标是列,都将多维数组抽像为二维数组又觉得抽象)
存储过程
如多维数组a[s1][s2]…[sn](n>2)按左下标优先的存储过程为:先顺序存储(n-1)维数组a[0],a[1],…,a[s1 - 1];在存上述每一个(n-1)数组时依旧采取左下标优先的顺序存储(n-2)维数组,如在存a[i1](0 <= i1 < s1)时,应该是这样的顺序存a[i1][0],a[i1][1],…,a[i1][s2-1];…,在存1维数组时采取这样的顺序a[i1][i2]…[in-1][0],a[i1][i2]…[in-1][1],…,a[i1][i2]…[in-1][sn-1],(0 <= i1< s1,0 <= i2 < s2,0 <= in-1< sn-1),到此此n维数组存储完毕。
采用的数学逻辑
实际上,多维数组此种方式下的存储采取了这样子的数学方法:在计im(im增1)前计满im+1至sm+1。(0 <= m < n-1,im为数组第m+1个下标值)。
计算a[i1][i2]…[in]的地址
在多维数组的存储下,书中老是喜欢干这样一个事儿:计算a[i1][i2]…[in]的地址。这其实就是求在a[i1][i2]…[in]之前有多少个元素,即[i1][i2]…[in]前已经计了多少个数。
分析:ik代表的是多少个sk+1 * sk+2 *… *sn,对于ik+1下标所代表的值ik统计不到的,计算ik下标前有多少个数时,需要加上ik+1下标所代表的值。所以计算下标ik之前所计数个数(及数组元素个数)为:ik * sk+1 * sk+2*… *sn + ik+1 * sk+2 *… *sn + … + in-1* sn + in。
得到a[i1][i2]…[in]前的元素个数为:i1* s2 * s3 * sn + i2 * s3* sn + … + in-1 * sn + in =
如果想象不出来多维空间行列关系的可以靠这个数学方法来理解求取多维数组a[i1][i2]…[in]的公式。实际上也就是利用了这个数学方法来存储的数组,不存在行、列之说,如此行列对应只是为了形象的解决现实数学中的问题,如矩阵用二维数组来存储参与运算时,对矩阵的分析就可以对应到二维数组中(如下标)来分析。
(2) 多维数组右下标优先的存储方式n>2
在计im(im增1)前计满im-1至sm-1。(0 < m < = n-1,im为数组第m+1个下标值)。
同理得到a[i1][i2]…[in]前的元素个数为:in* sn-1 * sn-2 * s1 + in-1 * sn-2* s1 + … + i2 * s1 + i1 =
3 总结
为符合数组在存储上的特点,多维数组的存储方式就两种:
- 从最左下标开始计数存储。
- 从最右下标开始计数存储。
此次小笔记记录完毕。
多维数组存储的两种方式相关推荐
- C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)
C语言的二维数组初始化的几种方式介绍 1.直接赋值 2.循环对每个元素赋值 3.借用memset/memset_s初始化为0或-1 4.`数组所有元素初始化为相同值(用于大数组初始化贼方便)` 1.直 ...
- c语言关于数组输入的两种方式
今天上课的时候老师有讲到数组输入有两种方式,一种是直接赋值输入进数组,第二种是利用地址赋给数组,下面是代码: 第一种:直接输入 void model(int *p)//(int p[]){for(i= ...
- PageRank、图计算、图存储的两种方式
目录 PageRank 什么是PageRank? 算法原理 入链 ====投票 入链数量 入链质量 网络上各个页面的连接图 计算过程 初始值 迭代递归计算(收敛) 图存储的两种方式 代码实现 Page ...
- vue编写一个登录页面,使用Tab栏实现“账号登录”和“二维码登录”这两种方式的切换
编写一个登录页面,使用Tab栏实现"账号登录"和"二维码登录"这两种方式的切换,并通过transition组件结合animate.css实现切换时的动画效果 1 ...
- 【C语言】二维数组遍历的3种方式
#include <math.h> #include <stdio.h> #include <stdlib.h>#define ROW 2 #define COL ...
- 数仓知识10:数据库存储的两种方式-行存储和列存储
0. 前言 目前大数据存储主要有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based).业界对两种方案有许多争持,争论的焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠 ...
- java二维数组初始化(java二维数组初始化的三种方式)
用java求二维数组(3*3)的所有元素之和 设你的数组是data[][]double sum=0;for(int i=0;i java一维数组/二维数组运用的例子有什么? util.*; publi ...
- php 便利jq,jquery怎样遍历数组?jquery遍历数组常用的两种方式
在jquery中,我们常用$().each和$.each()这两个方法来进行数组的遍历,$().each和$.each()这两种方法表面看起来好像差不多,但是,实际上这两个方法是有区别的,两个方法在针 ...
- php多维数组合并_两种PHP二维数组合并的方式
本文主要和大家分享第一种合并方式:通过PHP的数组API给出的array_merge方法来合并一个数组 ,希望能帮助到大家. 代码:$a = array(array("1",&qu ...
最新文章
- 字节开启员工期权兑换,126美元每股;
- 【知识图谱】人工智能技术最重要基础设施之一,知识图谱你该学习的东西
- 微服务、SOA 和 API对比与分析
- 悟透JavaScript引子
- Spark2.1.0——运行环境准备
- Django学习笔记5-url
- 30.github 搭建 blog
- 985高校硕导跳槽高中当老师,博士扎堆中小学,是内卷还是进步?
- 使用uib-tab时,获取页面输入框内容
- 回归分析中的多重共线性问题
- 努比亚服务器设置在哪个文件夹,【小师傅教程】关于 努比亚自带邮箱 设置
- 锁定计算机后如何不黑屏,怎么设置电脑黑屏时间_怎么设置电脑不黑屏
- conda install -y 参数
- 一起设计一个Android倒计时组件
- cocos1.6.2升级 cocos1.9.3后 微信登陆闪退
- 初级会计只刷题能行吗?
- 物理学在计算机领域的应用,物理学在计算机中的应用.pdf
- .net core 文件夹打包下载
- python题目-统计出字符串中各字符出现的次数并以字典形式保存并排序
- 用php实现md5解密源码,亲测可用
热门文章
- 歌剧《猫》的经典唱段《memory》中英文对照
- 强化学习(1)-什么是强化学习
- 图片超过200kb怎么变小?怎么把图片压缩到想要的大小?
- Win10设置系统补丁更新服务器,win10如何关闭自动更新补丁_win10关闭自动更新补丁的图文教程...
- ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
- 半球贴180度全景图片
- 被各种手机浏览器的推荐烦死,推荐一种干净、有效的浏览器操作
- 关于IOS设备window onscroll滚动条滚动事件不触发的问题
- xcode iOS 上传appstore 一直卡在正在通过 App Store 进行鉴定
- Mysql- --DQl语句(select数据查询语言,多表查询,View试图)linux常用(重点)