ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C# 数据结构与算法】数组 广义表 稀疏矩阵

2022-05-18 03:00:16  阅读:165  来源: 互联网

标签:存储 广义 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有