数据结构总结笔记4:数组、广义表

一、考试内容:

1,数组的逻辑结构定义,特点;

(1)数组一旦被定义,它的维数维界就不再改变。

(2)除了结构的初始化和销毁之外,数组只有存取元素修改元素值的操作。

 

2,数据的存储结构;数组的顺序表示和实现

类型特点:只有引用型操作,没有加工型操作;数组是多维的结构,而存储空间是一个一维的结构。

顺序存储方式——有两种顺序映象的方式:

1)以行序为主序(低下标优先); 如高级语言BASIC,COLBOL,C,PASCAL等;

2)以列序为主序(高下标优先); 如FORTRAN

多维数组中的元素之间的关系是一种线性关系,但多维数组不能象线性表一样作插入和删除运算,因为这两种运算有可能引起数组的维数变化。可见,一旦建立了数组,数组中元素之间的关系也就确定了,所以数组采用顺序存储是自然的事了。

在计算机中,内存的结构是一维的,数组是个多维的结构,因此用一维内存来存储多维数组就必须按某种次序将数组元素排成一个线性序列。

 

以“行序为主序”的存储映象  “行序为主序” 即 “低下标优先

二维数组A中任一元素ai,j 的存储位置

  LOC[i,j]=LOC[0,0]+(b_{2}*i+j)L      {b_2{}}:行元素个数

 

以“列序为主序”的存储映象  “列序为主序” 即 “高下标优先

二维数组A中任一元素ai,j 的存储位置

  LOC[i,j]=LOC[0,0]+(b_{1}*j+i)L  {b_1{}}:列元素个数

 

数组具有随机存取的特性,给出一组下标便可求得相应数组元素的存储位置。

二维数组Ab1×b2中,假设每个元素占用L个存储单元,按行序为主序存储数组。要求求出元素aij的存储地址。

元素下标从0开始,aij是第i行,第j列的。

其前共有i行元素,元素个数为b2*i;

在同一行中其前还有j个元素。所以存储地址为:LOC[i,j]=LOC[0,0]+(b_{2}*i+j)L

  LOC[0,0]是a00的存储地址,称为数组的起始存储位置或称为基地址。

3,稀疏矩阵的压缩存储;

矩阵:二维数组,可采用顺序存储来存储其中的元素。

某些高阶矩阵的特点问题

特点:阶数很高;有很多值相同的元素,或大多数元素的值为零。

问题:零值或值相同的元素占了很大(浪费)空间;计算中进行了很多与零值的运算,遇除法,还需判别除数是否为零;

解决方法及作用:采用压缩存储节省存储空间。

压缩存储:为多个值相同的元素分配一个存储空间,零元素不分配存储空间。

4,压缩存储主要针对两种类型的矩阵:

1,特殊矩阵:值相同的元素或零元素在矩阵中的分布有一定规律。

例如: 三角矩阵、对角矩阵

2,稀疏矩阵(随机稀疏矩阵):矩阵中多数元素值为零。

稀疏矩阵如何判定?

假设 m 行 n 列的矩阵含 t 个非零元素,则称\delta = \frac{t}{m*n} 为稀疏因子。通常认为\delta<= 0.05 的矩阵为稀疏矩阵

5,特殊矩阵:三角矩阵、对称矩阵、带状矩阵。

  • 1,三角矩阵

①下三角矩阵:

只需存储下三角的非零元素。按行序为主序存储的序列为:

特点:第i行恰好有i个元素,元素总数为n(n+1)/2;

压缩量:将下三角矩阵压缩到长度为:n(n+1)/2  的一维数组b中。

地址关系:

a_{ij}之前的前i-1行共有元素: 1+2+3+4+....+(i-1)=i(i-1)/2  个

a_{ij}是在第i行上的第j个元素,因此有:LOC[i,j]=i(i-1)/2+j

 

②上三角矩阵

第一行有n个元素;

第二行有n-1个元素;

第i行上有n-i+1个元素,前i-1行共有:\sum_{i=1}^{i-1}(n-i+1)=\frac{i-1}{2}(2n-i+2) 元素

在第i行上,a_{ij}是第j-i+1个元素,则地址关系为:LOC[i,j]=\frac{i-1}{2}(2n-i+2)+j-i+1

 

  • 2、对称矩阵

    若n阶矩阵A中的元素满足性质a_{ij}=a_{ji}    1\leqslant i,j\leqslant n  则称为n阶对称矩阵。

压缩:为每一对对称元素分配一个存储空间,将n2个元素压缩到( n2-n)/2+n=n(n+1)/2 (对角线元素)个元素的空间中。则相应的地址关系为:

 

  • 3、带状矩阵(对角矩阵)

     若一个n阶矩阵中,所有非零元素都集中在以对角线为中心的带状区中,称为n阶带状矩阵。

三对角带状矩阵: 压缩原则:以行为主;以对角线为主

在三对角带状矩阵中,除满足条件:外,其他元素都为零。

行为主压缩:三对角矩阵:

    第1行和第n行有2个元素,其余每行非零元素都为3个。需存储的元素个数:3(n-2)+4=3n-2个。

压缩:将带状矩阵压缩到一个长度为3n-2的数组中。

地址关系分析:

a_{ij}之前的前i-1行共有2+3(i-2)个非零元素,在第i行上a_{ij}处于第j-i+2个位置,因为j-i的结果只能是-1,0,1,所以它的位置有1,2,3三个取值。

 

地址关系为: LOC[i,j]=3i-4+(j-i+2)=2i+j-2

即:a_{ij}=b[2i+j-2],下标从1开始。b:压缩数组

 

随机稀疏矩阵的压缩存储方法:只存储稀疏矩阵的非零元素

  • 方式一:三元组顺序表

特点(又称有序的双下标法):

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

缺点: 当需要按行号随机存取某一行的非零元素时,需要从头开始进行查找。

改进:取得每行第一个非零元在三元组中的位置。行逻辑联接的顺序表

 

  • 方式二:行逻辑联接的顺序表

增加一个数据成员rpos:每行第一个非零元的位置; rpos值:在稀疏矩阵的初始化函数中确定。

 

  • 方式三:十字链表

三元组顺序表表示的稀疏矩阵

    优点:节约空间和运算时间。

    缺点:当矩阵进行加法、减法或乘法运算而使矩阵的非零元素个数和位置在操作过程中变化较大时不适宜。

如“将矩阵B加到矩阵A上”的操作,由于非零元的插入和删除将会引起A.Data中元素的移动。

    方法:采用链式存储结构。

稀疏矩阵的十字链表表示法,可以十分灵活和有效的表示各种复杂的结构以实现各种运算。

结点结构:   i,j,e分别表示该非零元素所在的行,列和非零元素的值

 right是向右域,链接同一行中下一个非零元素;down是向下域,链接同一列中下一个非零元素

 

同一行的非零元素通过right域链接成一个线性链表;同一列的非零元素通过down域链接成一个线性链表;

每个非零元素既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,所以称这种存储结构为十字链表。

每个行链表和列链表分别设有头指针,用两个一维数组来存储行链表和列链表的头指针。

 

6,广义表的定义及存储结构

本质:对线性表的一种拓宽。原线性表的一个数据项又由一个小的线性表构成。

广义表是递归定义的线性结构,是n(n≥0)个元素的有限序列,记作 LS=(α1,α2,…,αn)

αi(1≤i≤n)为原子(单个数据元素),或广义表。

例如: A = (  )    F = (d, (e))     D = ((a,(b,c)), F)     C = (A, D, F)    B = (a, B) = (a, (a, (a, ...... ,  ) ) )

 

广义表和线性表的区别:

1) 线性表中ai是单个元素

2) 广义表中,ai可以是单个元素,也可以是广义表。

 

常用操作及术语

表的长度:广义表中数据元素的个数。表名:LS称为广义表的名字(习惯用大写)。

子表:当αi是一个广义表,则称它为LS的子表。

表头:当LS非空时,称第一个元素α1为LS的表头 (HEAD)。

表尾:称除表头以外的其余元素(α2,α3,…,αn)组成的表是LS的表尾(Tail)。广义表的表尾必是广义表

例如:   LS=(A,D) =(( ),( E, F)) = (( ),((a, (b, c)),F ))

Head( LS ) = A      Tail( LS ) = ( D )    Head( D ) = E        Tail( D ) = ( F )

Head( E ) = a       Tail( E ) = ( ( b, c) )   Head( (( b, c)) ) = ( b, c)   Tail( (( b, c)) ) = ( )

Head( ( b, c) ) = b    Tail( ( b, c) ) = ( c )     Head( ( c ) ) = c        Tail( ( c ) ) = ( )

 

应用:广义表不仅浓缩了线性表、数组、树、有向图等常见数据结构的特点,而且在有效利用存储空间方面更胜一筹。

成功使用广义表的领域:文本处理、人工智能、代数操作、计算机图形等。

广义表与递归结合:求深度;复制广义表;创建广义表的存储结构。

 

二、考试要求:

了解数组及广义表的定义及特点,掌握数组的特点、存储结构及广义表的实际应用,

掌握稀疏矩阵的压缩存储方法,能够在压缩存储下实现矩阵的各种运算。

发布了38 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_40165004/article/details/99692868