【C# 数据结构与算法】数组 广义表 稀疏矩阵
作者:互联网
数组
数组是一种数据集合,数据元素按次序存储于一个地址连续的内存空间中。数组是其他数据结构实现顺序存储的基础。
线性表结构可以具有弹性,既可以是简单的数组,也可以扩展为复杂的数据结构----广义表
逻辑上数组可以看成二元组<下标,值>,哈希表也是二元组<健,值>
C#语言中,数组都是在运行时分配所需要的空间。
一维数组
则第i个教据元素的地址为:
addr(ai)=addr(a0)+i*c //addr(a0)为数组的首地址 C为每个元素占用c个存储单元
根据数组元素的下标就可计算出该元素的存储地址,因而可 存取数组元素的值,并且该操作的复杂度是O(1),具有这种特性的在储结构称为随机存储结构,数组是一种随机存储结构。
二维数组
二维数组表示数组的数组,二维数组常用来表示一个矩阵,由于存储的效率低,所有经常采用稀疏矩阵来压缩
Am×n表示由m×n个元素ai,j组成的矩阵,可以看成是由m行一维数组组成的(行)数组,或是n列一维数组组成的(列)数组。
矩阵Am×n也可以视为一种特殊的双重线性表,矩阵中的每个元素ai,j同时属于两个纡性表:第i行的线性表和第j列的线性表。
二维数组的顺序存储结构具有随机存储特性,对数组元素进行随机存取的时间复杂度为O(1)。
稀疏矩阵
稀疏矩阵的存储一共有三种方式:
1.三元组顺序表方式存储。
2.行逻辑链接的顺序表。
3.十字链表法。
稀疏矩阵的三元组顺序表存储方式虽然空间复杂度下来了,但是时间复杂度上去了。
广义表
广义表的定义:
在广义表中约定:
① 第一个元素是表头,而其余元素组成的表称为表尾;
② 用小写字母表示原子类型,用大写字母表示广义表。
广义表与线性表的区别和联系?
广义表中元素既可以是原子类型,也可以是广义表; 当每个元素都为原子且类型相同时,就是线性表。
广义表是线性表的推广,也称为列表(lists)
广义表是n(n>=0)个数据元素a0,a2,.......,an组成的有限序列,记为:
Gs=(a0,a2,.......,an)
ai可以是称为原子的,不可再分的单元素,也可以是可再分的线性表或者广义表,这些可在分的元素称为子表。
广义表的特性
有次序性:一个直接前驱和一个直接后继
长度:表中直接元素/子表的个数;
深度:表中括号的最大嵌套层数
可递归:自己可以作为自己的子表,长度是有限值,深度却可能是无穷值。将允许递归的广义表称为递归表。
可共享:可以为其他广义表所共享。广义表可作其他广义表的的子表元素。例如在下面例子中,广义表L分别是,广义表T和G不同层次上的元素。我们称表T和G共享子表L,共享可通过引用实现。
在算法中,通过子表的引用,可以避免在母表中重复列出子表的值,这样就利用子广义表的共享特性,
达到减少在储结构中的数据冗余和节约存储空间的目的。将允许数据元素共享的广义表称为再入表
树:如果限制广义表中元素的共享和递归,所得到的结构就是树结构,树中的叶子节点就是广义表中的原子元素,非叶子节点对于子表,例如T(3,L(1,2))是一种树的层次结构。将于树结构对于的广义表称为递归表。
线性表:线性表是广义表的特例,当广义表的元素全部是原子时,该广义表是线性表,例如广义表L(1,2)是一个线性表。
L(1,2):深度为1,长度为2
L1( ):为空表,长度为0
L2(L1( )):L2长度为1
T(3,L(1,2)):深度为2
G=(4,L,T)=(4,(1,2),(3,(1,2))):长度为2
广义表存储结构
广义表中的元素是可以具有不同结构的,所以难以用顺序结构来表示,通常都采用链式的存储结构。在这个结构中我们共有三种类型的节点,一种保存正常值的,一种是头节点,一种是子表节点。
在这里我们来看看下面几种的存储结构。
A = ()
B = (a,b,c)
C = (a,b,(c,d),e)
D = (a,b,(c,d),(e,(f),h))
广义表的图形表示
用广义表的形式表达线性表、树和图等基本的数据结构如图7.2所示。
在图7.2中可见,线性表、树和图结构具有以下特性:
(1)广义表L(1,2)的数据元素全部是原子,元素对应的结点都是原子结点,该广义表为具有线性特性的线性表。
(2)广义表T(3,L)的数据元素中有原子,也有子表,但表中不存在共享和递归成分该广义表为具有树结构特性的纯表。原子元素用叶结点表示,子表用分枝结点表示。
(3)广义表G(4,L, T)的数据元素中有子表,并且表中有共享成分,该广义表为具有图结构特性的再入表。
(4)广义表Z(e,Z)的数据元素中有子表且有递归成分,该广义表为具有图结构特性的递归表。
下面列举一些广义表的例子:
A=():A 是一个空表,其长度为 0。
B=(b, c):B 是一个长度为 2 的列表。
C=(a, (d, e, f)):C 是一个长度为 2 的列表,其中第一个元素是原子 a,第二个元素是子表 (d, e, f)。
D=(A, B, C):D 是一个长度为 3 的列表,其中 3 个元素都是子表。
E=(a, E):E 是一个长度为 2 的列表,它是一个递归表。
广义表可以用图形象地表示,如上述例子可以用下图表示。图中用圆圈表示广义表,用方块表示原子。
标签:存储,广义,C#,元素,矩阵,数组,子表,数据结构,线性表 来源: https://www.cnblogs.com/cdaniu/p/16279415.html