数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组

目录

  • 数组
    • 维度:
      • 一维
      • 二维
      • 三维
      • N维
    • 结论,特点
    • 定位某个元素
    • 顺序存储方式
      • 二维数组的顺序存储方式(行序为主序)
    • 矩阵
      • 特殊矩阵的压缩存储

数组

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

维度:

一维

  • 若线性表中的数据元素是非结构的简单元素
  • 就称该数组是一维数组
  • 逻辑结构是线性结构,定长线性表
  • 声明格式:数据类型 变量名称[长度];

二维

  • 一维数组的数据元素又是一维数组,可以这么理解

  • 逻辑结构

    • 非线性结构:每个数据元素既在一个行表中(行一维数组),又在一个列表中(列一维数组)
    • 线性结构的定长线性表:二维数组的每个数据元素也是一个定长的线性表
  • 声明格式:数据类型 变量名称[行数(数组第一维)][列数(数组第二维)];

  • 骚操作:typedef elemtype array2[m][n];等价于:typedef elemtype array1[n];typedef array1 array2[m];(elemtype为数据类型)

三维

  • 二维数组中的元素又是一个一维数组
  • a[m1][m2][m3]各维元素个数为m1,m2,m3
  • 下标为i1,i2,i3的数组元素存储位置为LOC(i1,i2,i3)=a+i1m2m3+i2*m3+i3
  • a为数组首元素的存储位置,i1m2m3是前i1页(表示维度的量词)总元素个数,i2*m3是第i1页的前i2行总元素个数,i3是第i2行前i3列的元素个数(注意每列一个,因为限定在了第i2行)

N维

  • n-1维数组中的元素又是一个一维数组结构
  • 这类似于嵌套定义然后展开嵌套的内容
    数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第1张图片

结论,特点

  • 结论:线性表结构是数组结构的特例,数组结构是线性表结构的扩展

  • 特点:结构固定——定义数组后维数和维界([0,维长度-1]的闭区间两边分别为维下界和维上界)不再改变,所以数组不适用于增删操作

  • 适用于查(取)改和数组初始化/销毁操作

定位某个元素

数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第2张图片

  • 其中a为数组名,也是数组首地址

  • i为数组下标值,L是数组元素所占的内存字节数(比如int型变量在32位机是4字节)

顺序存储方式

  • 以行序为主序(低下标优先)

  • 以列序为主序(高下标优先)

二维数组的顺序存储方式(行序为主序)

  • 求存储位置都是求数组元素的地址,但地址又分小地址(因为不同类型占不同内存字节的缘故),以第一个小地址作为数组元素的存储位置
  • a[i][j]的存储位置Loc(i,j)=Loc(0,0)+(n*i+j)*L,存储位置取存储单元的首地址(假设int型数组元素占4个字节,即一个int型存储单元由4个小存储单元组成,这个数组元素的存储位置就取头个小存储单元)
  • Loc(0,0)为数组开始存储位置,每个数组元素需要L个存储单元,(ni+j)是a[i][j]前面所有元素的个数,i代表前面一共有i行,因为数组从0开始,到i-1这一行经过i行,n就是每一行的元素个数,j就是数组元素a[i][j]这一行前面的元素个数(前面有多少列(0~j-1共j列)就有多少个元素个数在a[i][j]这一行这一个元素的前面,然后加起来L就是a[i][j]前面所有元素所需要的内存单元,然后加上首位置(首地址)就是a[i][j]的存储位置(存储地址)
  • 例题:数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第3张图片

矩阵

  • 一个由mxn个元素排列成的m行n列的表

  • 常规存储形式:二维数组(还有非常规存储形式,在下面介绍)

  • 常规存储特点:随机存取,存储密度1,运算简单

  • 常规存储弱点:相同值的元素很多且呈某种规律分布/零元素多,这些情况不适宜常规存储

  • 非常规存储:压缩存储——为多个相同的非零元素只分配一个空间,零元素不分配空间——用于特殊矩阵

特殊矩阵的压缩存储

  • 对称矩阵

    • 特点:对角线为对称轴,对角线上下的三角区域元素对称
    • 对称矩阵上下三角的元素数(包括对角线的元素)均为n(n+1)/2 (1+2+…+n)
    • 压缩存储方法:以行序为主序(先存第一行元素从左往右依次存,再第二行从左往右,再第三行。。。第N行从左往右这样存储在一个一维数组中)将一个三角存在一维数组sa[n(n+1)/2]中,如图所示
    • 求a[i][j]在压缩存储所用的一维数组的位置
      数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第4张图片
  • 三角矩阵

    • 特点:矩阵对角线以下(或以上)的数据元素(不包括对角线)全部为常数C
    • 压缩存储方法:重复的矩阵元素C共享一个元素存储空间,剩下的上/下三角矩阵按行序主序和共享元素空间存在一维数组里,共占用n(n+1)/2 +1个元素空间,即sa[n(n+1)/2+1]
    • 求a[i][j]求a[i][j]在压缩存储所用的一维数组的位置
      数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第5张图片
      其中上三角矩阵是说上三角矩阵有意义,不全都是一个常数C。下三角矩阵是说下三角矩阵有意义,不全都是一个常数C。
  • 对角矩阵(带状矩阵)

    • 压缩存储方法及对角矩阵特点及举例:
      数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第6张图片
      数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第7张图片
  • 稀疏矩阵

    • 特点:设在mxn的矩阵中有t个非零元素,令δ=t/(mxn),当δ<=0.05时称为稀疏矩阵,如图所示:
      数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第8张图片

    • 压缩存储方法:三元组法或十字链表法

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

      • 三元组法(有序的双下标法)

        • 三元组(i,j,aij)唯一确定矩阵的一个非零元,i代表第i行,j代表第j列,aij代表一个非零元素,注意这里i、j从1开始,也就是考虑普通矩阵而非矩阵的存储形式——矩阵数组。三元组法代表矩阵二维数组的方式我举个例子给你说明:
          数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第9张图片
        • 三元组的不同表示方法决定稀疏矩阵不同的压缩存储方法
        • 三元组顺序表(以下标1开始,下标0用来描述稀疏矩阵总体信息:总行数,总列数,非零元素总个数,如图所示:
          数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第10张图片
        • 优点:非零元素在表中按行序有序存储,因此便于进行依次顺序处理的矩阵运算(取某矩阵元素,改某矩阵元素)
        • 缺点:不可随机存取,必须像链表一样从头找我想找的行号来存取某一行的非零元素
      • 十字链表法

        • 两个指针数组:一个行头指针数组,一个列头指针数组,就像这样,如图所示:
          数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第11张图片
          数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第12张图片

        • 优点:灵活插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素。从而简便实现矩阵各种运算

        • 特点:矩阵的每一个非零元素用一个结点表示,该结点结构为:
          数据结构与算法学习笔记(第四章 串、数组、广义表)(2)数组_第13张图片
          row是非零元素值所在矩阵二维数组的行,col是非零元素值所在矩阵二维数组的列,value是非零元素值

你可能感兴趣的:(数据结构)