数据结构期末复习(三)

数据结构期末复习(三)

数组的存储结构

二维数组的顺序存储结构分为以行序为主序的存储方式和以列序为主序的存储方式。

以行序为主的存储方式就是常规的先存第0行的每列,再存第一行的每列,以此类推。以列为主的存储方式同理。

对于三维数组来说,按下标从左到右的顺序存储。例如,设a[0][0][0]的地址为p,则对于数组a[m][n][r],a[i][j][k] = p + (i*n*r + j*r + k)*l;

稀疏矩阵

三元组顺序表

转置函数最简单的方法就是row和col对应的值交换,并且row和col顺序交换,然后按照行从小到大排序。

O(col*num)的转置算法:

把M矩阵的第0列的所有元素找出来,转置,放到N矩阵的第0行,把M矩阵的第1列所有元素找出来,转置,放到N矩阵的第1行,以此类推。每次照完所有第n列元素需要扫描col次,转置num个元素,时间复杂度O(col*num)。

int i=0;
for(int col=0;col<cols;col++){//找每一列的所有元素
    for(int j=0;j<num;j++){
        if(triElems[j].col == col){//找到了之后存到N的第j行
            N.triElems[i].row = triElems[j].col;
            N.triElems[i].col = triElems[j].col;
            N.triElems[i].val = triElems[j].val;
            i++;
        }
    }
}

O(num)算法:

空间换时间,申请两个数组,一个用来记录每一列的第一个非0元存储的起始位置,另一个用来存储这一列有多少个非0元。因为在原矩阵的三元组表示种,存储是连续的,一旦我们知道了某一列存储的非0元起始地址和长度(相当于知道了终止地址),我们就能确定整个一列,进而转置整个一行。下面简要写一下。

int *cNum = new int[col+1];//存储每一列非0元个数
int *cPos = new int[col+1];//存储每一列第一个非0元起始位置
for(int col=0;col<cols;col++) cNum[col] = 0;
for(int i=0;i<nums;i++) cNum[triElems[i].col]++;
cPos[0] = 0;
for(int col=1;col<cols;col++){//下一列第一个非0元的起始位置=上一列非0元的起始位置 + 上一列非0元个数
    cPos[col] = cPos[col-1] + cNum[col-1];
    //我觉得这里很巧妙
}
//由于是从小列到大列求的非0元起始位置,所以的时候的存储顺序就是M矩阵按列从小到大存储的
//上面就都求完了,直接开始转置
for(int i=0;i<nums;i++){
    int j=cPos[triElems[i].col];//得到的是M矩阵存储的第i个元素的col列的起始非0元位置
    N.triElems[j].row = triElems[i].col;
    N.triElems[j].col = triElems[i].row;
    N.triElems[j].row = triElems[i].val;
    cPos[triElems[i].col]++;
    //注意这里是重点,非常巧妙的++,这样下一次循环进来找到的非0元起始位置就是之前位置+1,不用再写个循环了
}

广义表

定义相关

LS=(a1,a2,...,an)

LS是表名,表的长度为n,长度为0的广义表为空表。如果n>=1,则a1是表头,(a2,a3,...,an)是表尾。(注意表头没有加括号表示是原子,而表尾加括号了表示子表)

广义表种括号的重数代表广义表的深度。递归表的深度为无穷大。

表头、表尾

一个例子足以

A = ((),(a,b,c),d,e)
head(A) = ()
tail(A) = ((a,b,c),d,e)
取到c的操作是head(tail(tail(head(tail(A)))))

画存储结构

广义表的存储结构为:
tag- data/slink-link
tag=1,为原子; tag =0, 为子表.
data--为原子数据,slink---为子表地址
link---为本元素的同层下一个元素的地址

A = ((),a,(b,(c,d)),(e,f))

原文地址:https://www.cnblogs.com/aoru45/p/10463727.html

时间: 2024-10-22 15:33:48

数据结构期末复习(三)的相关文章

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j

数据结构期末复习第三章栈和队列

第三章:栈和队列 栈的特性:后进先出(LIFO) 1.  输入序列为ABC,可以变为CBA时,经过的栈操作为( B )A. push, pop, push, pop, push, popB. push, push, push, pop, pop, popC. push, push, pop, pop, push, popD. push, pop, push, push, pop, pop 解析: ABC经过push,push,push操作后,从栈顶到栈底元素为CBA,经过pop,pop,pop出

数据结构期末复习第一章绪论

前言: 最近快期末了,复习下数据结构,下列习题和答案解析,大部分来源于网络,如有不对之处还请指出. 在这里,星云祝各位考生期末考试顺利,新年快乐! 第一章绪论 1. 数据结构是一门研究非数值计算的程序设计问题中计算机的(操作对象)以及它们之间的(关系)和(操作)的学科. 2. 下列关于数据结构的基本概念中,叙述正确的是( C ). A. 数据元素是数据的最小单位. B. 数据的逻辑结构是指数据的各数据项之间的逻辑关系. C. 任何一个算法的设计取决于选定逻辑结构,而算法的实现依赖于采用的存储结构

数据结构期末复习第二章线性表

第二章:线性表 1.线性结构的基本特征答:线性结构是若干数据元素构成的有序(次序)集① 集合中必存在唯一的一个“第一元素”:② 集合中必存在唯一的一个 “最后元素”:③ 除第一元素之外,均有 唯一的前驱:④ 除最后元素之外,均有 唯一的后继. 2.线性表的顺序存储结构和链式存储结构分别是______.(  D )   A. 顺序存取的存储结构.顺序存取的存储结构  B. 顺序存取的存储结构.随机存取的存储结构   C. 随机存取的存储结构.随机存取的存储结构  D. 随机存取的存储结构.顺序存取

数据结构期末复习第六章树和二叉树

知识点: 先序遍历二叉树规则:根-左-右 1.访问根结点 2.先序遍历左子树 3.先序遍历右子树 中序遍历二叉树规则:左-根-右 1.先中序遍历左子树 2.再访问根节点 3.最后访问中序遍历右子树 后序遍历二叉树规则:左-右-根 1.后序遍历左子树 2.后序遍历右子树 3.访问根结点 1.  一棵二叉树的先序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为(A)A. CBEFDA                       B. FEDCBAC. CBEDFA        

数据结构期末复习(いち)--顺序栈定义及使用

1 #include <iostream> 2 using namespace std; 3 #define MAXSIZE 100 //顺序栈存储空间初始分配大小 4 #define OK 1 5 #define ERROR 0 6 #define OVERFLOW -1 7 typedef struct //顺序栈结构定义 8 { 9 int *base; //栈底指针 10 int *top; //栈顶指针 11 int stacksize; //栈可使用的最大容量 12 } Sqsta

数据结构期末复习(ろく)--双向链表

1 #include <iostream> 2 using namespace std; 3 typedef struct DulNode 4 { 5 int data; 6 struct DulNode *next; //后继节点 7 struct DulNode *prior; //前驱节点 8 }DulNode,*DulLinkList; 9 10 11 void Creat_DLink(DulLinkList &L) //尾插法创建单链表 12 { 13 L = new Dul

[期末复习] 计算机操作系统复习(一)

操作系统期末复习 第一章-操作系统引论 操作系统的作用 作为计算机硬件系统之间的接口 系统资源的管理者 实现对计算机资源的抽象 操作系统的发展过程 未配置操作系统的计算机系统 人工操作,用户独占全机,资源浪费 脱机输入输出(Off-Line I/O)方式. 单道批处理系统 这里批处理指的是把很多作业放在一个磁带上,一次性输入给计算机 解决了人机矛盾(每执行一道程序都要手动装载)和cpu与I/O设备速度不匹配矛盾.提高了系统的吞吐量. 缺点:系统资源利用率低(I/O请求成功前CPU空闲). 多道批

20172327 2017-2018-2 《程序设计与数据结构》第三周学习总结

20172327 2017-2018-2 <程序设计与数据结构>第三周学习总结 教材学习内容总结 讨论对象的创建和使用对象引用变量. 探索String类提供的服务. 描述如何组织成Java标准类库包. 探索随机和数学课提供的服务. 讨论如何使用NumberFormat和DecimalFormat类格式输出. 介绍枚举类型. 教材学习中的问题和解决问题 暂无 代码学习中的问题和解决过程 问题1:在做项目pp0301时,出现了下面这中情况 问题1解决方案:通过仔细的分析,我发现代码是对的,主要是数