【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解

这篇具有很好参考价值的文章主要介绍了【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

  • 作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: 【数据结构】:该专栏专注于数据结构知识,持续更新,每一篇内容优质,浅显易懂,不失深度!
  • 近期目标:写好专栏的每一篇文章

数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

👩‍🎓一、前言

数组是一种特殊的的数据结构,在存储结构是顺序存储(一个连着一个),所有只要给定数组的维度,和各维度的长度,数组中元素个数就是确定的。且给出首元素的地址,例如根据A[i][j][k],的i、j、k就可以计算出该元素的地址(或与首元素的地址之差)

在计算机中,内存储器的结构是一维的。

  • 对于一维数组,可以直接按照顺序直接存储
  • 对于常见的二维数组,通常采用两种方式实现物理结构上的一维顺序存储
    • 行优先:一行一行的存储,存完一行,再在这一行尾元素后面接着存储下一行
    • 列优先、
  • 三维数组:三维数组元素的下标号由三个数字组成:即行、列、纵 3个方向
    下面的图片是以行为主序的方法存放
    数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

🥕总之,知道了多维数组的维度、每维度的上下限,就可以把多维数组的元素按照一维的顺序存储,存储在计算机中。

同样,根据数组的下标,可以计算出其在计算机中的位置(地址),这是重点和难点。

下面我将分别从

  • 一维数组的地址计算
  • 二维数组的地址计算
  • 三维数组的地址计算

3个方面来详细讲解

🍊二、一维数组的地址计算

一维数组的本质其实就是线性表,它的存储非常简单

假设一维数组的元素为:(我们假设A数组下标从1开始)

A = a 1 , a 2 , a 3 , a 4... a i A = a1,a2,a3,a4 ... ai A=a1,a2,a3,a4...ai

假设每个元素占用size个字节(存储单元),那么ai的存储地址为:首元素地址 + (该元素和首元素相差元素个数)× size

图形结合来理解(黄色的箭头就是地址(指针
数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

🥕 ai的存储地址计算公式

L o c ( A [ i ] ) = L o c ( A [ 1 ] ) + ( i − 1 ) × s i z e Loc(A[i]) = Loc(A[1]) + (i-1)×size Loc(A[i])=Loc(A[1])+(i1)×size

🍊三、二维数组的地址计算

二维数组分行优先和列优先,原理都是一样的。这里我们按照行优先,A数组下标从(1,1)开始

假设每个元素占用size个字节(存储单元),那么A[i][j]的存储地址为:首元素地址 + (该元素和首元素相差元素个数)× size

数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

这个i-1j-1的减去这个1,代表的起使分别是起使元素下标A[1][1]中的两个1

  • i - 1表示相差的行数,× 一行元素个数,表示i这一行之前所差的所有元素个数
  • j-1表示的是只考虑i这一行,A[i][j]所相差元素个数

理解了这个,当A数组首元素下标从(0,0)开始,可以很轻松的写出相应的公式了!

🥕 A[i][j]的存储地址计算公式(行优先)

L o c ( A [ i ] [ j ] ) = L o c ( A [ 1 ] [ 1 ] ) + ( n ( i − 1 ) + j − 1 ) × s i z e Loc(A[i][j]) = Loc(A[1][1]) + (n(i-1) + j -1)×size Loc(A[i][j])=Loc(A[1][1])+(n(i1)+j1)×size

🍊四、三维数组的地址计算

关于三维数组的理解方式,我是这样理解的:
数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯

  • 看成二维数组,行还是表示二维数组的行,列还是表示二维数组的列
  • 但是原来二维数组中的一个元素,这里是一纵元素
  • 按行优先存储,依旧还是存完一行的元素,再存储下一行。但是注意,由于这个特殊的二维数组,它的元素是一个一维数组,所以在每一行依次存储每一个元素时,比如必须从前往后把这个元素(即一维数组遍历完!)存好,再存储下一个!

数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯
所以对于三维数组:

A [ 1.. r ] [ 1.. m ] [ 1.. n ] A[1..r][1..m][1..n] A[1..r][1..m][1..n]
假定每个元素占size个存储单位,并且按照行优先(就是我假设的那个把三维数组看成一个二维数组的那个行,体现在三维数组中,起使就是m*n的平面,每次r+1其实就跳过了m*n这个平面中这么多元素!)

🥕理解&推导(行优先)

首元素的地址为Loc(A[1][1][1])

  • 对于A[i][1][1]的地址,因为该元素前面有i-1个m*n的平面的元素,所以
    L o c ( A [ i ] [ 1 ] [ 1 ] ) = L o c ( A [ 1 ] [ 1 ] [ 1 ] ) + ( ( i − 1 ) × m × n ) × s i z e Loc(A[i][1][1]) = Loc(A[1][1][1]) + ( (i-1)×m×n)×size Loc(A[i][1][1])=Loc(A[1][1][1])+((i1)×m×n)×size
  • 对于A[i][j][1]的地址,则在上面元素个数((i-1)×m×n)基础上,再加j-1个“元素”,上面我说道,三维数组看作二维数组,一个元素,可以看作是长度为纵维度长度,即n的一个一维数组;所以需要加上(j-1)×n
  • 所以A[i][j][k]就在上面两个答案累加的基础上加上该元素所在纵维度的没有算的k-1个元素即可

🥕 A[i][j][k]的存储地址计算公式(行优先)

L o c ( A [ i ] [ j ] [ k ] ) = L o c ( A [ 1 ] [ 1 ] [ 1 ] ) + ( ( i − 1 ) × m × n + ( j − 1 ) × n + k − 1 ) × s i z e Loc(A[i][j][k]) = Loc(A[1][1][1]) + ( (i-1)×m×n+(j-1)×n + k-1)×size Loc(A[i][j][k])=Loc(A[1][1][1])+((i1)×m×n+(j1)×n+k1)×size

🍊五、n维数组的地址计算

对于n维度数组

A [ c 1.. d 1 , c 2.. d 2 , c 3.. d 3 , . . . , c n . . d n ] A[c1..d1,c2..d2,c3..d3,...,cn..dn] A[c1..d1,c2..d2,c3..d3,...,cn..dn]

🥕 A[j1][j2]...[jn]的存储地址计算公式(行优先)

L o c ( A [ j 1 ] [ j 2 ] . . . [ j n ] ) = L o c ( A [ c 1 ] [ c 2 ] . . . [ c n ] ) + ∑ i = 1 n a i × ( j i − c i ) Loc(A[j1][j2]...[jn]) = Loc(A[c1][c2]...[cn]) +\sum\limits_{i=1}^{n}ai×(ji-ci) Loc(A[j1][j2]...[jn])=Loc(A[c1][c2]...[cn])+i=1nai×(jici)

其中:
a i = s i z e × ∏ k = i + 1 n ( d k − c k + 1 ) , 1 < = i < = n ai = size×\prod\limits_{k=i+1}^{n}(dk-ck+1),1<=i<=n ai=size×k=i+1n(dkck+1),1<=i<=n


数据结构数组地址计算,数据结构|刷题专栏,算法,数据结构,c++,c语言,蓝桥杯文章来源地址https://www.toymoban.com/news/detail-731638.html

  • Java岛冒险记【从小白到大佬之路】
  • LeetCode每日一题–进击大厂
  • 算法

到了这里,关于【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构--顺序表】移除元素

    题目描述: 代码实现: 1、指针实现 2、数组下标访问实现 

    2024年02月07日
    浏览(24)
  • 【数据结构】静态分配的顺序表插入元素

    分析一下当前算法的时间复杂度,注意:顺序表的元素移动,是从最后一个元素依次移动的 1、新元素插入到表尾,i=n+1,就不用移动元素,不移动就不要走for循环,for循环0次,时间复杂度为O(1) 2、新元素插入到表头,i=1,就要移动所有元素,有n个元素移动n个,for循环n次,

    2024年02月07日
    浏览(30)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(31)
  • 【数据结构】二叉树的顺序存储结构 —— 堆

    👑作者主页:@进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构

    2023年04月08日
    浏览(31)
  • C/C++数据结构---顺序表---线性存储结构

    个人主页: 仍有未知等待探索_小项目,洛谷刷题,数据结构-CSDN博客 专题分栏---数据结构: 数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、知识储备 二、引例  三、顺序表 第一步,先创建一个顺序表类型 第二步,定义和初始化顺序表    第三步,顺序表的基本操作

    2024年02月08日
    浏览(29)
  • 数据结构:图文详解顺序表的各种操作(新增元素,查找元素,删除元素,给指定位置元素赋值)

      目录 一.顺序表的概念 二.顺序表的实现 新增元素 默认尾部新增 指定位置添加元素 查找元素 查找是否存在 查找元素对应的位置 查找指定位置对应的元素 删除元素 获取顺序表长度 清空顺序表 在线性数据结构中,我们一般分为俩类:顺序表和链表         顺序表是一

    2024年02月05日
    浏览(49)
  • 数据结构课设:图书信息管理--顺序存储和链式存储

    在本实验中,我选择了两种存储结构(顺序存储和链式存储)来对图书信息表的修改问题进行描述,即:3.基于顺序存储结构的图书信息表的修改问题描述 和 13.基于链式存储结构的图书信息表的修改问题描述。 3.基于顺序存储结构的图书信息表的修改问题描述 首先,定

    2024年02月08日
    浏览(35)
  • 【数据结构】结构实现:顺序存储模式实现堆的相关操作

    🚩 纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章着重讲解了使用顺序结构实现堆的插入和删除等操作。  二叉树的顺序存储是指将二叉树中的所有节点按照一定的顺序(一层一层)存储到一个数组中。  我们可以通过数组下标来表示

    2024年02月08日
    浏览(32)
  • C/C++数据结构---顺序表---链式存储结构1(不带头节点)

    个人主页: 仍有未知等待探索_小项目,数据结构,洛谷刷题-CSDN博客 专题分栏---数据结构: 数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、引例 1.顺序存储结构 2.链式存储结构 二、链表的创建和初始化 1.链表创建的分析 1)头插法 过程: 代码的实现: 2)尾插法 过程

    2024年02月07日
    浏览(27)
  • 【数据结构】线性表的顺序存储结构及实现——C语言版

    线性表的顺序存储结构称为 顺序表 ,其基本思想是 用一段地址连续的存储单元一次存储线性表的数据元素。 设顺序表的每个元素占用 c 个存储单元,则第 i 个元素的存储地址为: 所以, 只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间

    2024年03月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包