首页 > 代码库 > 【数据结构】数组和广义表

【数据结构】数组和广义表

感觉数组这一段没讲什么太多的东西。

先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外。操作只有初始化 销毁 取元素 修改元素。然后讲了下适合用顺序存储结构,多维情况下根据下标(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的多项式 这样就可以用广义表表示了。

 

之后讲了下递归算法求广义表深度(括号重数)和广义表复制,没仔细看好繁琐啊... 而且我在网上也没查到什么关于广义表的应用,于是不想看了..