数组的存储

        我们都知道数组的存储方式是顺序存储,而内存空间是线性存在的,以为数组存出可想而知,那么,多维数组是如何存放的呢?

我们先看一维数组,一维数组从第一个元素开始依次存放在一段连续的存储空间。

 一维数组的地址计算:

         设一维数组A的下界为low,每个元素占w个单元,则LOC(A[i])=base+(i-low)*w

 

再看二位数组,由于内存空间是线性的,所以二位数组要么是一行一行存放,要么是一列一列存放,即行主序和列主序。

二位数组的地址计算:二维数组
       设二维数组A的下界分别为low1,low2,列数为n2,每个元素占w个单元,则  LOC(A[i][j])=base+((i-low1)*n2+j-low2)*w

推广到k维数组:LOC(A[i1,i2,…,ik])=((i1*n2+i2)n3+i3)…)nk+ik)*w +base-((low1*n2+low2)n3+low3)…)nk+lowk)*w

### 数组存储与实现的数据结构 数组是一种线性数据结构,其特点是通过连续的内存空间来存储相同类型的多个元素。这种特性使得数组能够提供快速随机访问的能力。以下是关于数组存储和实现的关键概念: #### 1. **数组的分类** 根据数组存储数据之间的逻辑关系不同,可以将其细分为一维数组、二维数组以及更高维度的 n 维数组[^1]。 - **一维数组**:表示单列或多行的一系列数据项。 - **多维数组**:如二维数组通常用于表格形式的数据存储,三维及以上则适用于更复杂的空间建模场景。 #### 2. **动态数组的实现** 在某些编程语言中(例如 C#),可以通过动态调整大小的方式来扩展传统固定长度数组的功能。以下是一个基于 C# 的动态数组实现示例[^2]: ```csharp public class Array1<E> { private E[] data; // 定义泛型普通静态数组 private int N; // 定义数组中元素的个数 public Array1(int capacity) // 构造函数, 创建一个规定容量的数组 { data = new E[capacity]; N = 0; } public Array1() : this(10) // 没有参数的构造函数,默认容量为10 { } public int Capacity // 类的属性,获取数组容量 { get { return data.Length; } } public int Count // 类的属性,获取当前数组中的元素数量 { get { return N; } } public bool IsEmpty // 判断数组是否为空 { get { return N == 0; } } } ``` 上述代码展示了如何封装一个支持基本功能的动态数组类,包括设置初始容量、查询实际元素数目以及判断空状态等功能。 #### 3. **数组的内存布局** 对于计算机内部而言,数组是以一段连续分配的内存区域保存各个元素。如果相邻两元素间存在固定的偏移量,则可通过简单的算术运算定位任意位置上的值。比如,在整型 (int) 数组情况下,每增加一位索引就相当于跳过四个字节的距离[^3]。 #### 4. **特殊矩阵的压缩存储** 当处理稀疏或其他具有规律性的大型矩阵时,为了节省空间资源,常采用特定技术对其进行优化表达。下面给出了一种不规则形状但仍然保持紧凑排列的例子[^4]: ```java int[][] array = {{1, 1, 1}, {2, 3, 4, 5}, {0, 0, 0, 0}}; ``` 这里展示的是一个多行变长子列表构成的整体结构体实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值