首页 > 其他分享 >数组

数组

时间:2023-02-03 20:22:05浏览次数:38  
标签:存储 数组 元素 矩阵 非零 一维

数组

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

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


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

    • 线性结构(定长线性表
    • 声明格式:数据类型 变量名称[长度];例: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

标签:存储,数组,元素,矩阵,非零,一维
From: https://www.cnblogs.com/yuanyu610/p/17090353.html

相关文章

  • 代码随想录-数组-C++总结
    1.二分查找重点区分左闭右开,左闭右闭两种写法中的差异,理解循环中的不变量,这样在returnr还是l和什么时候l+1r-1什么时候不需要+1-1很重要。35.搜索插入位置-力扣(Leet......
  • js中数组对象排序
    //数组对象按照指定属性排序--冒泡写法constduplicateRemovalBubbling=function(oldArr,key){for(leti=0;i<oldArr.length;i++){for(letj=0;j<oldArr.length......
  • JS数组的常用方法-常用篇
     1.join数组变成字符串   不改变原数组1letarr1=['I','Love','You']2console.log(arr1.join(),arr1);//I,Love,You,['I','Love','You']3......
  • 找到所有数组中消失的数字
    给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。constfindDisappe......
  • js判断数组对象或对象对象数组是否包含元素包含值
    vararr=[{key:1,name:'牛百叶'},{key:2,name:'虾滑'}];//bool为true说明数组中包含这个对象为false则不包含varbool1=arr.som......
  • java翻转数组
    写一个方法用于翻转数组staticvoidarr(String[]str){String[]arr=newString[str.length];intcount=0;for(inti=str.length-1;i......
  • 【小学数学向】最大子数组和
    正规解法状态转移方程f(i)=maxvarmaxSubArray=function(nums){letpre=0,maxAns=nums[0];nums.forEach((x)=>{pre=Math.max(pre+x,......
  • java数组中的异常类型整理
    java数组中的异常类型整理对于程序中出现异常,是很多程序员不想看到的情况,因为这就需要我们去查询异常的原因,然后进行一些处理异常的操作。在java数组操作时,也会有一些异常......
  • Codeforces 1354 D. Multiset(树状数组)
    题意;要你实现一个求第k大数的数据结构。树状数组模板题。AC代码:constintN=1e6+50;inta[N];intn,q;voidadd(intp,intval){while(p<=n){a[p]+=va......
  • POJ 2299 Ultra-QuickSort(树状数组+离散化 或 归并排序求逆序)
    DescriptionInthisproblem,youhavetoanalyzeaparticularsortingalgorithm.Thealgorithmprocessesasequenceofndistinctintegersbyswappingtwoadjace......