【数组与广义表】(基本概念与思路)

embedded/2024/9/24 7:02:13/

1.数组的定义及特点

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

1.1一维数组

  • 若线性表中的数据元素为非结构的简单元素,则称为一维数组
  • 一维数组的逻辑结构:线性结构定长的线性表
  • 声明格式:数据类型 变量名称 [长度];
  • 例:int num[5]={0,1,2,3,4};

1.2二维数组

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

  • 二维数组的逻辑结构:既可以看作线性结构,又可以看作非线性结构
    在这里插入图片描述

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

  • 其中,行数为第一维的长度,列数是第二维的长度

  • 例:int num[5][8];
    注意:在C语言中,一个二维数组类型也可以定义为一维数组类型
    (其分量类型为一维数组类型),即:
    在这里插入图片描述
    1.typedef elemtype array2[m][n]; 这行代码定义了一个名为 array2 的新类型,它是一个二维数组,其元素类型为 elemtype,第一维大小为 m,第二维大小为 n。这意味着你可以使用 array2 来声明一个具有 m 行和 n 列的数组
    2.typedef elemtype array1[n]; 这行代码定义了一个名为 array1 的新类型,它是一个一维数组,其元素类型为 elemtype,大小为 n。
    3.typedef array1 array2[m]; 这行代码实际上是将 array2 定义为一个指向 array1 类型数组的指针,这里的 m 表示指针可以指向 m 个 array1 类型的数组。换句话说,它创建了一个指向一维数组(每个一维数组有 n 个 elemtype 元素)的指针数组每个指针指向一个 n 元素的数组

m行n列
在这里插入图片描述

如上图:

1.2.1 若看做线性结构

我们可以把每一行看做一维数组中的一个元素(共m个元素):
下标i表示一整行看做一个整体元素
在这里插入图片描述

也可以把每一列看做一维数组中的一个元素(共n个元素):
在这里插入图片描述
下标j表示一整列看做一个整体元素

1.2.2 若看做非线性结构

  • 以a11为例
    在这里插入图片描述
  • 所在行中有一个前驱,一个后继;
  • 所在列中同样有一个前驱,一个后继
  • 即一个元素不只有一个前驱和一个后继了,即为不是一对一的非线性结构

1.3三维数组---------n维数组

在这里插入图片描述

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

2.数组的抽象类型定义

在这里插入图片描述

2.1实例:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

COL每一列间的前驱后继关系:如a00** 在列上的后继为 a10
ROW:每一行间的前驱后继关系:如a00 在行上的后继为 a01

3.数组的顺序存储

在这里插入图片描述
在这里插入图片描述

3.1一维数组实例;

在这里插入图片描述
在这里插入图片描述
这里的地址编号没有使用正规的16进制,是因为便于表述和计算
在这里插入图片描述

  • 需要知道的信息:第一个元素(下标为0)的起始地址a每个元素占多大空间L待计算地址元素之前共存在几个元素i
  • 则下标为i的元素的起始地址为:a+i*L
  • 所以这里LOC(3)=2000+3*4=2012

总结得到一维数组中元素起始地址的计算方法:
在这里插入图片描述

3.2二维数组

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

m行n列的二维数组

在这里插入图片描述
在这里插入图片描述

3.2.1行序为主序C,PASCAL,JAVA, Basic

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体在内存中的存储:
在这里插入图片描述
在这里插入图片描述
m行n列的元素从头到尾,一行一行地存储在下标为0~m*n-1这个连续的内存空间中

3.2.1.1二维数组实例;

有二维数组A[m][n](A[0… …m-1][0… …n-1]),则如何计算数组元素a[i][j]的存储位置

与一维数组类似:
在这里插入图片描述

  • 需要知道的信息:第一个元素(下标为0)的起始地址a每个元素占多大空间L待计算地址元素之前共存在几个元素i
  • 只不过这里待计算地址元素之前共存在几个元素i通过计算前面有几行元素,和该元素所处行中该元素之前有几个元素来取得

在这里插入图片描述
分析过程如下:
在这里插入图片描述

3.2.2 列序为主序FORTRAN

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体在内存中的存储:
在这里插入图片描述

在这里插入图片描述

m行n列的元素从头到尾,一列一列地存储在下标为0~m*n-1这个连续的内存空间中

3.3三维数组------n维数组(了解即可)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.特殊矩阵的压缩存储(思路为重)

4.1为什么需要压缩存储

  • 矩阵: 一个由 m*n个元素排成的 m行n列的表
    在这里插入图片描述
  • 矩阵的常规存储: 将矩阵描述为一个二维数组
  • 矩阵的常规存储的特点:
    (1)可以对其元素进行随机存取;
    (2)矩阵运算非常简单;
    (3)存储的密度为1
  • 不适宜常规存储的矩阵:
    (1)值相同的元素很多且呈某种规律分布;
    (2)零元素多
  • 矩阵的压缩存储:
    (1)为多个相同的非零元素分配一个存储空间;
    (2)对零元素不分配空间
  • 能够压缩的矩阵类型:如对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等

4.2对称矩阵的压缩存储

4.2.1特点与存储方法

在这里插入图片描述
这里的占用空间数,是使用等差数列求和公式:Sn=n*(an+a1)/2求解得到的

4.2.2对称矩阵的存储结构

  • 对称矩阵上下三角中的元素数均为:(注意是n行n列的矩阵)
    推理过程:
    第一行1个,第二行2个,…第n行n个:
    1+2+3+…+n= n*(an+a1)/2 = n*(n+1)/2
    在这里插入图片描述
  • 可以以行序为主序将元素存放在一个一维数组中。
    在这里插入图片描述
  • 例如:以行序为主序存储下三角:
    在这里插入图片描述
    在这里插入图片描述
    则aij的下标K为 (i-1)*i/2+(j-1)
    推导如下:
    在这里插入图片描述

4.3三角矩阵的存储结构

4.3.1特点与存储方法(与对称矩阵十分类似,只多了一个共享存储单元)

在这里插入图片描述
注意这里下标为0的存储空间中存储常数c;
下三角矩阵下标推导:
在这里插入图片描述
下三角矩阵推的有点费劲,以后有机会再推

4.4对角矩阵(带状矩阵)的存储结构

4.4.1特点与存储方法

在这里插入图片描述
注意:

  • 有几条对角线上的元素为非零元素,就称为几对角矩阵

在这里插入图片描述
存储在二维数组

4.5稀疏矩阵的存储结构

4.5.1特点与存储方法

4.5.1.1存储特点:

在这里插入图片描述

4.5.1.2存储方法:

实例一:6行7列的(伪)稀疏矩阵如下:
在这里插入图片描述
在这里插入图片描述
则使用三元组法进行存储:(这里的行列号均从1开始记起)

(1)i:非零元素所处行号
(2)j:非零元素所处列号
(3)aij:非零元素的元素值

在这里插入图片描述

4.5.1.2.1存储方法1:三元组顺序表法(有序的双下标法)

在这里插入图片描述

  • 那么通过这样的三元组顺序表就可以轻松地得到对应的稀疏矩阵
    在这里插入图片描述
  • 三元组顺序表的优劣:
    (1)三元组顺序表又称有序的双下标法
    (2)三元组顺序表的优点:非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
    (3)三元组顺序表的缺点:不能随机存取。若按行号存取某一行中的非零元,则需从头开始进行查找
4.5.1.2.2存储方法2:三元组链式存储法(十字链表法)
  • 十字链表法的优点
    在这里插入图片描述
  • 十字链表法的存储特点
    在这里插入图片描述
    数据域存:行数,列数,元素值
    指针域包含两个指针,保证衔接正常

两个实际的例子如下:
在这里插入图片描述
在这里插入图片描述
为了方便查找,我们需要两个头指针数组
行的头指针数组(长度等于行数)以及列的头指针数组(长度等于列数)

5.广义表

5.1广义表的定义与组成

5.1.1广义表的定义

在这里插入图片描述
一个具体的实例如下:
在这里插入图片描述

5.1.2广义表的组成

在这里插入图片描述

  • 表头
    在这里插入图片描述
    在这里插入图片描述
    注意:表头可以是一个原子,也可以是一个子表
  • 表尾
    在这里插入图片描述
    在这里插入图片描述
    注意:表尾不是最后一个元素,而是一个子表。
    需要将除表头之外的所有元素包含在括号

5.1.3一些具体的实例:

在这里插入图片描述
分析(3):表尾为((b,c));
两个括号。
外层括号证明表尾是一个子表内层括号证明表尾中只有一个元素

5.1广义表的性质

在这里插入图片描述
在这里插入图片描述

5.1广义表与线性表的区别

在这里插入图片描述

5.2广义表的基本运算

  • (1)求表头GetHead(L):非空广义表的第一个元素,可以是一个原子,也可以是一个子表
    -(2)求表尾GetTail(L):非空广义表除去表头元素以外其它元素所构成的表。表尾一定是一个表

实例如下:
在这里插入图片描述
注意:广义表不能使用数组存储,需要使用链表进行存储


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

相关文章

数据看板多端查看无压力,教你轻松设置响应式布局

最近,山海鲸可视化新增了一个非常实用的功能,叫作“响应式布局”。今天我来为大家介绍一下这个新功能以及它如何提升我们在不同设备上的使用体验。 你可能在用手机浏览网页时注意到,有些网站在手机和电脑上的显示方式几乎相同。然而&#xff…

SpringBoot自定义starter(starter的命名规范、starter的结构、自定义starter、为配置属性添加描述信息、检验配置属性)

文章目录 0. 前言1. 前置知识1.1 starter的命名规范1.2 分析 Mybatis 的场景启动器1.3 starter的结构分析 2. 创建自定义的场景启动器2.1 创建父工程2.2 初始化父工程2.3 创建 autoconfigure 模块2.4 创建 starter 模块2.5 在 starter 模块中引入 autoconfigure 模块的依赖2.6 …

Python 数学建模——假设检验

文章目录 前言参数假设检验单个总体均值的假设检验 σ \sigma σ 已知 σ \sigma σ 未知 两个总体均值的假设检验参考代码 非参数假设检验分布拟合检验——卡方检验KS 检验(Kolmogorov-Smirnov 检验)Wilcoxon 检验Wilcoxon符号秩检验Wilcoxon秩和检验 前…

Servlet-学习笔记-下

9. 请求转发和响应重定向 9.1 概述 什么是请求转发和响应重定向 请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段 请求转发通过HttpServletRequest 实现,响应重定向通过HttpServletResponse 实现 请求…

FPGA开发:初识FPGA × 开发环境

FPGA是什么? FPGA的全称是现场可编程门阵列(Field Programmable Gate Array),一种以数字电路为主的集成芯片,属于可编程逻辑器件PLD的一种。简单来说,就是能用代码编程,直接修改FPGA芯片中数字…

数据库系统 第48节 数据库性能调优

数据库性能调优是一个多方面的任务,涉及到数据库配置、查询优化、硬件资源等多个层面。以下是一些关键的调优策略,以及如何在源代码中实现这些策略。 索引调优 索引是提高数据库查询性能的关键。正确地使用索引可以显著减少查询所需的数据扫描量&#…

二进制方式安装K8S

⼀、安装说明 本⽂章将演示Rocky 8 ⼆进制⽅式安装⾼可⽤k8s 1.28.0版本。 ⽣产环境中,建议使⽤⼩版本⼤于5的Kubernetes版本,⽐如1.19.5 以后的才可⽤于⽣产环境。 ⼆、集群安装 2.1 基本环境配置 请统⼀替换这些⽹段,Pod⽹段和service和…

【Leetcode学习笔记】路径总和

【题目描述】给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 输入&#x…