数组

数组

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

定义后维数和维界不再改变(结构固定) 且一般不做插入和删除操作,因此一般采用顺序存储结构


  • 一维数组:线性表中的数据元素为非结构的简单元素

    • 线性结构(定长线性表
    • 声明格式:数据类型 变量名称[长度];例:int a[5];
  • 二维数组:一维数组中的数据元素又是一位数组结构

    • 逻辑结构:

      • 线性结构(定长的线性表):该线性表中的每个元素(行/列)也是一个定长的线性表

      • 非线性结构:每一个元素既在一个行表中又在一个列表中

        image

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

    • 定义:

      typedef int array2[5][8];
      等价于
      typedef int array1[8];
      typedef array1 array2[5];
      
  • 三维数组:二维数组中的每个元素是一个一维数组

  • n维数组:n-1维数组中的每个元素是一个一维数组


抽象数据类型定义

image

基本操作:

​ lnitArray (&A,n,bound1, ...,boundn)

​ DestroyArray(&A)

​ Value(A,&e,index1,...,indexn)

​ Assign(A,&e,index1,...,indexn)

}ADT Array


数组的顺序存储

数组可以是多维的,但是存储数据元素的内存单元地址是一维的

因此在存储数组结构之前,需要解决将多维关系映射到一维关系的问题


一维数组

image

L为每个元素占用字节数


二维数组A(m,n)

  • 以行序为主序(低下标优先):BASIC,COBOL,PASCAL,C,JAVA

    image

    位置:LOC(i,j)=LOC(0,0)+(i*n+j)*L

    通常矩阵用二维数组存储:运算简单、可随机存取,存储密度为1

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

    • 对称矩阵:在n*n矩阵中,满足aij=aji(i>=1,j<=n)

      只存储上(下)三角包括主对角线的元素,共占用n*(n+1)/2个元素空间

      image

      对应存放在一维数组中的下标为aij前面的元素个数

      image

    • 三角矩阵:对角线以下(上)的元素不包括对角线全部为常数c

      重复元素c共享一个存储单元,共占用n*(n+1)/2+1个元素空间

      image

    • 对角矩阵:所有非零元素都集中在以主对角线为中心的区域中,其余都是0

      例:五对角矩阵(五条非零对角线)

      image

      按对角线存储:

      image

    • 稀疏矩阵:非零元素的个数<=5%

      用三元组来存储(i,j,value)

      image

      M由{(1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)}和矩阵维数(6,7)唯一确定

      三元组顺序表/有序的双下标法:通常用第1行表示行数、列数、非零元素个数

      • 优:非零元素在表中按行序有序存储,便于进行按行进行行处理的矩阵运算
      • 缺:不能随机存取,需从头开始查找
      0 6 7 8
      1 1 2 12
      2 1 3 9
      3 3 1 -3
      4 3 6 14
      5 4 3 24
      6 5 2 18
      7 6 1 15
      8 6 4 -7

      稀疏矩阵的链式存储结构:灵活插入、删除元素

      十字链表:

      矩阵的每个非零元素有一个结点表示:(row,col,value)+right(用于链接同一行的下一个非零元素)+down(用于链接同一列的下一个非零元素)

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

    image

三维数组a[m1][m2][m3]

按页/行/列存放(页优先)

image

位置:LOC(i1,i2,i3)=a+i1*m2*m3+i2*m3+i3


n维数组

各维元素个数为m1, m2, m3, ..., mn
下标为i1,i2,i3,...,in 的数组元素的存储位置:

LOC(i1,i2,…,in ) = a + i1* m2* m3*...*mn+i2* m3* m4*…* mn+...…+ i(n-1) * mn
image

posted @ 2023-02-03 20:13  原语  阅读(106)  评论(0编辑  收藏  举报