首页 > 代码库 > 【数据结构】数组和广义表
【数据结构】数组和广义表
感觉数组这一段没讲什么太多的东西。
先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外。操作只有初始化 销毁 取元素 修改元素。然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 j3 ... jn)找到对应像素的存储位置 cn = L, ci-1 = bi * ci, LOC = LOC基址 + Σciji , L为每个元素存储的单位。 然后给了些实现代码。
新知识是: va_start( , );
va_arg( , );
va_end();
这三个可以用来处理变长参数表信息。
接着就是讲矩阵了。
首先是特殊矩阵的压缩。对于有规律的特殊矩阵,如对角矩阵、下(上)三角矩阵,对角矩阵。可以根据规律将矩阵存在一维数组中,建立起原始下标与压缩后矩阵下标的对应关系就好。
对没有规律的稀疏矩阵,只存储稀疏矩阵的非0元。需要三元组表存储(行、列、元素值)。根据三元组表的不同表示方式,得到稀疏矩阵不同的压缩存储方法。
①三元组顺序表 以行序为主序排列。 就是用个数组存起来,行号小的放前面。 讲了下这种结构下转置的操作,关键讲了下如何在转置后以行为主排序。又讲了个快速转置,就是存储了原矩阵每一列首元素的位置和每一列元素个数,这样就不用在之后排序了,直接放在对的位置就好了。
②行逻辑链接的顺序表,就是把每行第一个非0位置存了起来,为了方便抽取任意一行。讲了两个稀疏矩阵相乘的例子,说来说去就是为了去掉0与其他元素相乘这样冗余的计算需要行起始位置,具体没看,太繁琐。没什么新技术。
③十字链表 在两个稀疏矩阵相加时,非零元素数量变化可能很大,不宜采用顺序存储结构。 这种结构每个非零元有5个域(行、列、值、该行下一元素指针、该列下一元素指针) 用两个一维数组存储每一行和每一列的头结点。
广义表 说白了,就是一个表,表中的元素也可以是表。开始说表可以共享、可以递归但是后面的介绍都是在不可共享不可递归的前提下介绍的....表头和表尾的定义也略奇怪。表头很普通,就是第一个元素。表尾居然是剩下的所有元素。定义结构时,用到了联合跟枚举,感觉看了很有收获。
typedef enum{ATOM, LIST} ElemTag; typedef struct GLNode{ ElemTag tag; union{ AtomType atom; //元素可能是原子 struct {struct GLNode *hp, *tp;}ptr; //也可能是另一个广义表 }; }*GList;
讲了m元多项式的表示,大概意思就是不断的分解主变元,得到系数。如:
P=X10Y3Z2+2X6Y3Z2+3X5Y2Z2+X4Y4Z+6X3Y4Z+2YZ+15
=((X10+2X6)Y3+3X5Y2)Z2+((X4+6X3)Y4+2Y)Z
这样就可以用Z的系数表示多项式,而Z的系数又是Y的多项式,Y的系数又是X的多项式 这样就可以用广义表表示了。
之后讲了下递归算法求广义表深度(括号重数)和广义表复制,没仔细看好繁琐啊... 而且我在网上也没查到什么关于广义表的应用,于是不想看了..