数组-数据结构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

一说起数组,我们的印象中数组往往是某一门编程语言中包含的具体数据类型,其实不然。本节将从数据结构的角度讲解数组存储结构。


一、什么是数组存储结构

  • 数组:按一定格式排列起来的。具有相同类型的数据元素的集合。
  • 一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。
  • 一维数组的逻辑结构:线性结构。定长的线性表。
  • 声明格式:数据类型 变量名称[长度];

根据数组中存储数据之间逻辑结构的不同,数组可细分为一维数组、二维数组、…、n 维数组:

  • 一维数组,指的是存储不可再分数据元素的数组,如图 1 所示: 在这里插入图片描述
    图 1 一维数组存储结构示意图

  • 二维数组,指的存储一维数组的一维数组,如图 2 所示:
    在这里插入图片描述
    图 2 二维数组存储结构示意图

  • n 维数组,指的是存储 n-1 维数组的一维数组;
    注意:无论数组的维数是多少,数组中的数据类型都必须一致。

二、数组的顺序存储

  • 数组特点:结构固定——维数和维界不变。
  • 数组的基本操作:初始化,销毁,取元素,修改元素值。——一般不做插入和删除操作。

要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。所以,一般都是采用顺序存储结构来表示数组。

由于数组可以是多维的,而顺序存储结构是一维的,因此数组中数据的存储要制定一个先后次序。通常,数组中数据的存储有两种先后存储方式:

  1. 以列序为主(先列后行):按照行号从小到大的顺序,依次存储每一列的元素。

多维数组中,我们最常用的是二维数组。比如说,当二维数组 a[6][6] 按照列序为主的次序顺序存储时,数组在内存中的存储状态如图 1 所示:
在这里插入图片描述
图 1 以列序为主的二维数组存储状态

  1. 以行序为主(先行后序):按照列号从小到大的顺序,依次存储每一行的元素。

同样,当二维数组 a[6][6] 按照行序为主的次序顺序存储时,数组在内存中的存储状态如图 2 所示:
在这里插入图片描述
图 2 以行序为主的二维数组存储状态

C 语言中,多维数组的存储采用的是以行序为主的顺序存储方式。

1.多维数组查找指定元素

当需要在顺序存储的多维数组中查找某个指定元素时,需知道该元素的地址,通过以下几个步骤可以知道该元素的地址:

  • 多维数组的存储方式(以行序为主);
  • 多维数组在内存中存放的起始地址;
  • 该指定元素在原多维数组的坐标(比如说,二维数组中是通过行标和列标来表明数据元素的具体位置的);
  • 数组中数组的具体类型,即数组中单个数据元素所占内存的大小,通常用字母 L 表示;

根据存储方式的不同,查找目标元素的方式也不同。如果二维数组采用以行序为主的方式,则在二维数组 anm(表示该二维数组n行m列) 中查找 aij 存放位置的公式为:

LOC(i,j) = LOC(0,0) + (i*m + j) * L;

其中,LOC(i,j) 为 aij 在内存中的地址,LOC(0,0) 为二维数组在内存中存放的起始位置(也就是 a00 的位置)。(i* m+ j)表示aij前有(i*m+j)个元素,i为aij的行标,j为aij的列表,m为二维数组的列数。

三、特殊矩阵的压缩存储

矩阵的常规存储:将矩阵描述为一个二位数组。

矩阵的常规存储特点:可以对其元素进行随机存取;矩阵运算非常简单;存储的密度为1;

不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多。这样的矩阵称为特殊矩阵。

这里所说的特殊矩阵,主要分为以下两类:

  • 含有大量相同数据元素的矩阵,比如对称矩阵;
  • 含有大量 0 元素的矩阵,比如稀疏矩阵、上(下)三角矩阵;

针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。(节省内存)

1.对称矩阵

在这里插入图片描述
数据元素沿主对角线对应相等,这类矩阵称为对称矩阵。

结合数据结构压缩存储的思想,我们可以使用一维数组存储对称矩阵。由于矩阵中沿对角线两侧的数据相等,因此数组中只需存储对角线一侧(包含对角线)的数据即可。

2.稀疏矩阵

在这里插入图片描述
如果矩阵中分布有大量的元素 0,即非 0 元素非常少,这类矩阵称为稀疏矩阵。

压缩存储稀疏矩阵的方法是:只存储矩阵中的非 0 元素,与前面的存储方法不同,稀疏矩阵非 0 元素的存储需同时存储该元素所在矩阵中的行标和列标。

例如,存储图中的稀疏矩阵,需存储以下信息:

  • (1,1,1):数据元素为 1,在矩阵中的位置为 (1,1);
  • (3,3,1):数据元素为 3,在矩阵中的位置为 (3,1);
  • (5,2,3):数据元素为 5,在矩阵中的位置为 (2,3);
  • 除此之外,还要存储矩阵的行数 3 和列数 3;

由此,可以成功存储一个稀疏矩阵。


总结

本文简单对数据结构中的数组进行总结,摘要C语言中文网。错误之处请不吝指正。

猜你喜欢

转载自blog.csdn.net/qq_52208569/article/details/115330079