zoukankan      html  css  js  c++  java
  • 【数据结构】数组和广义表

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

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

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

  • 相关阅读:
    TensorFlow设置GPU占用量
    与服务器同步工程(expect脚本)
    C/C++中#pragma once的使用
    sublime text 3 快捷键大全
    Sublime Text 3 注册码
    如何用diff比较两个文件夹下的内容
    Error in building opencv with ffmpeg
    opencv: Rotate image by 90, 180 or 270 degrees
    初识HTTPS
    Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用
  • 原文地址:https://www.cnblogs.com/dplearning/p/3725976.html
Copyright © 2011-2022 走看看