数据结构——数组

embedded/2024/10/21 5:48:30/

数组的概念

数组:按一定格式排列起来的,具有相同类型的数据元素的集合。

一维数组

一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组。

一维数组的逻辑结构:线性结构。定长的线性表。

声明格式:数据类型 变量名称[长度];

a[0]~a[4]分别是0,1,2,3,4

二维数组

 二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组。

 为什么可以看成是非线性结构,因为每个元素,例如a11在行表中有前驱和后继,在列表中也有前驱和后继,不满足一对一的关系。

声明格式:
数据类型变量名称[行数][列数];

例:int num[5][8];

总共5x8=40个元素空间

行的下标范围:0~4

列的下标范围:0~7

结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。

数组特点:结构固定——定义后,维数和维界不再改变。

数组基本操作:除了结构的初始化和销毁之外,只有取元素和修改元素的操作。

n维数组的抽象数据类型

ADT Array{

}

 例:二维数组的抽象数据类型的数据对象和数据关系的定义

n=2(维数为2,二维数组)

b1:第一维长度(行数)b2:第二维长度(列数)

数组的基本操作

 

数组的顺序存储结构 

因为

(1)数组特点:结构固定——维数和维界不变。

(2)数组基本操作:初始化、销毁 、取元素、修改元素值。

一般不做插入和删除操作。

所以,一般都是采用顺序存储结构来表示数组。

注意:数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。

存储单元是一维结构,而数组是个多维结构,则用一组连续存储单元存放数组的数据元素就有个次序约定问题。

 需要解决的问题是我们怎么用顺序存储的方式将第几行第几列的元素表示出来?

 以行序为主序:

设数组开始存储位置LOC(0,0),存储每个元素需要L个存储单元,数组元素a[i][j]的存储位置是:LOC(i,j)=LOC(0,0)+(n*i*j)*L

三维:

 n维数组:

 特殊矩阵的压缩存储

矩阵:一个由m x n个元素排成的m行n列的表。

矩阵的常规存储:

        将矩阵描述为一个二维数组。

矩阵的常规存储的特点:

        可以对元素进行随机存取;

        矩阵运算非常简单,存储的密度为1。

不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多,这样比较浪费空间。

矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

 1、什么是矩阵的压缩存储呢?

若多个数据元素的值都相同,则只分配一个元素的存储空间,且零元素不占存储空间。

2、什么样的矩阵能够压缩?

一些特殊的矩阵,如:对角矩阵、对称矩阵、三角矩阵、稀疏矩阵(非零元素的个数较少)等。

(1)对称矩阵

【特点】在n x n的矩阵a中,满足如下性质:

        aij = aji(1<=i,j<=n)

【存储方法】只存储下(或者上)三角(包括主对角线)的数据元素。共占用n(n+1)/2个元素空间。

对称矩阵的存储结构

对称矩阵上下三角中的元素数均为:

n(n+1)/ 2(利用等差数列的计算公式)

可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中。

元素aij的存储位置为:前面有(i-1)行,所以是1+2+3+...+(i-1),然后是第j列,前面i行的元素(利用等差数列公式)总个数再加(j-1)个元素再加上初始位置就是aij元素的位置。

 三角矩阵的压缩存储

【特点】对角线以下(或者以上)的数据元素(不包括对角线)全部为常数c。

【存储方法】重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素空间:sa[n(n+1)/2+1]

 对角矩阵(带状)的压缩存储:

【特点】在n x n的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。

 【存储方法】

  • 以对角线的顺序存储

 稀疏矩阵存储

稀疏矩阵:设在m x n的矩阵中有t个非零元素。

 压缩存储原则:存各个非零元素的值、行列位置和矩阵的行列数。

三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。

三元组顺序表又称有序的双下标法。 

三元组顺序表的优点:非零元在表中按行序有序存储,因此便于进行依次顺序处理的矩阵运算。

三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找。

 稀疏矩阵的链式存储结构:十字链表

优点:它能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。

在十字链表中:在十字链表中,矩阵的每一个非零元素用一个结点表示该结点除了(row,col,value)以外,还要有两个域:

 


http://www.ppmy.cn/embedded/118267.html

相关文章

【Webpack】实现持久化缓存

回答重点 在 Webpack 中实现持久化缓存有几个关键策略&#xff0c;最核心的就是利用文件内容哈希&#xff0c;使得文件名发生变化&#xff0c;这样浏览器就会识别为新的资源而不是使用缓存的旧资源。具体步骤如下&#xff1a; 1&#xff09;使用 output.filename 和 output.c…

elasticsearch学习与实战应用

目录 前言一、学习路径二、核心概念三、实战应用四、优化策略总结前言 Elasticsearch的学习与实战应用是一个涉及多个方面的过程,以下将从学习路径、核心概念、实战应用及优化策略等方面进行详细介绍。 提示:以下是本篇文章正文内容,下面案例可供参考 一、学习路径 1. 基…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…

mac命令行分卷压缩与合并

对当前目录内的文件压缩的同时分卷 //语法:zip -r -s 1m 压缩文件名.zip 当前路径 zip -r -s 1m split.zip . //解压 zip -s 0 split.zip --out unsplit.zip unzip unsplit.zip 将一个zip文件进行分卷 一个900k的压缩包名为hello.zip,将其分割为每500K一个zip zip - hello.…

Java项目实战II基于Java+Spring Boot+MySQL的网上摄影工作室(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在数字化时代&#xff0c;摄影艺术已不再局限于传统媒介&#xff0c;而是借助互联网平台绽放新的光彩…

IEEE Transactions on Consumer Electronics (TCE)投稿指南

期刊官网&#xff1a;IEEE Transactions on Consumer Electronics 期刊模板下载&#xff1a;IEEE Transactions Template 投稿地址&#xff1a;IEEE Transactions on Consumer Electronic Submit System 期刊投稿guideline: IEEE Transactions on Consumer Electronics Submis…

Java | Leetcode Java题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(Node root) {if (root null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans new ArrayList<List<Integer>&g…

docker 部署minio

docker部署minio 前提部署minio连接minio参考链接 前提 已安装docker 部署minio mkdir -p ~/minio/datadocker run \-p 9000:9000 \-p 9001:9001 \--name minio \-v ~/minio/data:/data \-e "MINIO_ROOT_USERROOTNAME" \-e "MINIO_ROOT_PASSWORDCHANGEME123&…