数组和广义表可以看成是一种特殊的线性表,其特殊在于:表中的元素本身也是一种线性表,内存连续,根据下标在O(1)时间读写任何元素。
二维数组,多维数组,广义表,树,图都属于非线性结构。
数组
数组的顺序存储:行优先顺序,列优先顺序。数组中的任意元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。
关联数组(Associative Array),又称映射(Map)、字典(Dictionary)为抽象数据结构,包含着类似于(键,值)的有序对,不是线性表。
矩阵的压缩:
- 对称矩阵、三角矩阵:直接存储矩阵的上三角或下三角元素,注意区分i>=j和i<j的情况。
- 对角矩阵:除了主对角线和主对角线相邻两侧的若干条对角线上的元素之外,其余元素皆为零。
- 稀疏矩阵:非零元素个数远小于矩阵元素总数,比如三元组或十字链表,十字链表更适合矩阵的加法乘法等操作。
- 三元组顺序表,虽然节省了存储空间,但其时间复杂度比一般矩阵转置的算法还要复杂,同时还有可能增加算法的难度。因此,此算法仅适用于t(非零元素个数)<<m*n的情况。
- 稀疏矩阵,在采用压缩存储后将失去随机存储的功能。因为在这种矩阵中,非零元素的分布是没有规律的。为了压缩存储,就将每一个非零元素的值和它所在的行、列号做为一个结点存放在一起,这样的结点组成的线性表叫三元组表,它已经不是简单的向量,所以无法用下标直接存取矩阵中的元素。
- 对于三元组存储稀疏矩阵,每个元素要用行号,列号,元素值来表示,此外还要三个整数来记录矩阵的行数、列数和总的元素个数。
- 三元组转置:将数组的行列值相互交换,将每个三元组的i和j相互交换,重排三元组之间的次序,实现矩阵的转置。
广义表
广义表(Lists),又称列表,是线性表的推广。广义表是n(n>=0)个元素的a^1^,a^2^,a^3^,...,a^n^有限序列,其中a~i~或者是原子项,或者是一个广义表。若广义表LS(n>=1)非空,则a^1^是LS的表头,其余元素组成的表(a^2^,a^3^,...,a^n^)称为LS的表尾。广义表的元素可以是广义表,也可以是原子,也可以为空。表尾是指去除表头之后剩下的元素组成的表,表头可以为表或单个元素值,但表尾不可以是单个元素值。
例子:
- A=(),A是一个空表,其长度为零。
- B=(e),表B只有一个原子e,B的长度为1。
- C=(a,(b,c,d)),表C的长度为2,两个元素分别为原子a和子表(b,c,d)。
- D=(A,B,C),表D的长度为3,三个元素都是广义表。
- E=(a,E),表E是一个递归表,它的长度为2,E相当于一个无限的广义表E=(a,(a,E=(a,(a,...))))。
三个结论:
- 广义表的元素可以是子表,而子表的元素还可以是子表。由此,广义表是一个多层次的结构,可以用图形象的表示。
- 广义表可以为其他表所共享。如例4中,A,B,C是D的子表,在D中可以通过子表的名称来引用。
- 广义表的递归性。
考点:
- 广义表是0个或者多个单因素或子表组成的有限序列。广义表可以是自身的子表,广义表的长度n>=0,所以可以为空表。广义表的同级元素(只属于同一个表中的各个元素)具有线性关系。
- 广义表的表头可以为空,并不代表该广义表为空表。广义表()和广义表(())不同,前者是长度为零的空表,对其不能做求表头和表尾的运算;而后者是长度为1的非空表,对其进行分解,得到表头和表尾均是空表()。
- 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是head(tail(head(tail(LS))))。根据表头、表尾的定义可知:任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表,而其表尾必定是子表。也就是说,广义表的head操作,取出的元素是什么,那么结果就是什么。但是tail操作取出的元素外必须加一个表——"()"。tail(LS)=((d,e,f)),head(tail(LS))=(d,e,f),tail(head(tail(LS)))=(e,f),head(tail(head(tail(LS))))=e。
- 二维以上的数组,其实是一种特殊的广义表。
- 在非空广义表中,表头head可以是原子或一个表;表尾tail一定是一个表;广义表难以用顺序存储结构;广义表可以是一个多层次的结构。
原文地址:https://www.cnblogs.com/KX-Lau/p/12386378.html
时间: 2024-10-21 14:40:13