数据结构概论 第5章 数组和广义表 董黎刚 浙江工商大学信电学院.

Slides:



Advertisements
Similar presentations
数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
Advertisements

数据结构 2014年3月.
第五章 二次型. 第五章 二次型 知识点1---二次型及其矩阵表示 二次型的基本概念 1. 线性变换与合同矩阵 2.
§1 二阶与三阶行列式 ★二元线性方程组与二阶行列式 ★三阶行列式
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
第五章 数组和广义表.
§1 线性空间的定义与性质 ★线性空间的定义 ★线性空间的性质 ★线性空间的子空间 线性空间是线性代数的高等部分,是代数学
第一章 行列式 第五节 Cramer定理 设含有n 个未知量的n个方程构成的线性方程组为 (Ⅰ) 由未知数的系数组成的n阶行列式
第三章 栈和队列 Stack and Queue
第二章 矩阵(matrix) 第8次课.
第五章 数组和广义表 £5.1 数组 £5.2 矩阵的压缩存储 £5.3 广义表 £5.1.1 数组的定义 £5.2.1 特殊矩阵
第五章 数组和 广义表 数组 稀疏矩阵 广义表.
第五章 数组和广义表.
Array & General List.
第 4章 串和数组(二) 本讲主要内容: 数组的定义及其顺序表示和实现。 矩阵的压缩存储。 广义表的定义。
第七章 图 知识点2:图的存储结构.
串和数组.
第 1 章 数据结构 1.1 基本数据结构与算法 1.2 线性表 1.3 栈和队列 1.4 树和二叉树 1.5 查找 1.6 内部排序 65
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第2章 线性表 丽水学院工学院.
第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示.
第4章 串、数组和广义表 4.1 串 4.2 数组 4.3 广义表.
线性表练习.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
动态规划(Dynamic Programming)
第4章 串和数组 本章主要介绍下列内容: 串的定义、存储结构和基本运算 数组的定义、基本运算和存储结构 特殊矩阵的压缩存储.
顺序表的插入.
工业机器人技术基础及应用 主讲人:顾老师
第五章 数组 5.1 数组的定义 5.2 数组的表示和实现* 5.3 数组的压缩.
从zval看PHP变量
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:中国网页设计
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第五章 数组和广义表.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
Chapter 05 Sparse Matrix & Lists 第五章 稀疏数组和广义表
实数与向量的积.
顺序表的删除.
线性代数 第二章 矩阵 §1 矩阵的定义 定义:m×n个数排成的数表 3) 零矩阵: 4) n阶方阵:An=[aij]n×n
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
第5章 数组和广义表 本章主题:多维数组、特殊矩阵和广义表 教学目的:掌握数组和广义表的定义、运算及存储结构 教学难点:矩阵的压缩存储
第二章 Java基本语法 讲师:复凡.
VB与Access数据库的连接.
第四章 串和数组 4.1 串的定义* 4.2 串的表示和实现* 4.3 数组 4.4 数组的压缩.
单链表的基本概念.
顺序查找.
线性结构 线性结构的特点: 线性结构的种类 在数据元素的非空有限集中, (1)存在唯一的一个被称做“第一个”的数据元素;
第 四 讲 线性表(二).
第4章 Excel电子表格制作软件 4.4 函数(一).
§8.3 不变因子 一、行列式因子 二、不变因子.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
本 章 说 明 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的存贮结构
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
线性代数 第十一讲 分块矩阵.
2.2矩阵的代数运算.
线 性 代 数 厦门大学线性代数教学组 2019年5月12日4时19分 / 45.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 正文匹配模式 5.4 正文编辑 5.5 数组 5.6 数组的压缩.
§2 方阵的特征值与特征向量.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
定义5 把矩阵 A 的行换成同序数的列得到的矩阵,
4.2 图的存储结构(cont.) v1 v2 v3 v4 v5 vertex= v1 v2 v3 v4 v5 v
插入排序的正确性证明 以及各种改进方法.
第二章 线性表 线性表是一种最简单的线性结构 线性结构是一个数据元素的有序(次序)集.
第二部分 数据结构—— 用面向对象方法与C++描述.
§4.5 最大公因式的矩阵求法( Ⅱ ).
第5章 其他线性数据结构.
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
Presentation transcript:

数据结构概论 第5章 数组和广义表 董黎刚 浙江工商大学信电学院

1. 数组的逻辑结构

5.1.1 背景 数组(Array)是一种逻辑结构,是一种特殊的线性表:不能插入和删除元素(因为数组中元素的个数固定)。换句话说,数组是操作受限的线性表。 5.1 数组的逻辑结构

5.1.2 数组的特点 数组中不能插入和删除元素。因此一般数组都适合用顺序表存储(回避了顺序表的缺点)。 矩阵Am×n可以视为m*n个元素的线性表。然而,数组的数据元素也可以视为一个线性表,比如二维数组是“数据元素为一维数组(线性表)”的线性表。 5.1 数组的逻辑结构

5.1.2 数组的特点 二维数组中元素的顺序:行优先和列优先 5.1 数组的逻辑结构

5.1.2 数组的特点 按行优先顺序,元素aij的地址是Loc[i,j]=Loc[1,1]+n×(i-1)+(j-1) 如果每个元素占size个存储单元,则为: Loc[i, j]=Loc[1, 1] +(n×(i-1)+j-1)×size 5.1 数组的逻辑结构

5.1.3 操作 InitArray(A, n, bound1, …, boundn):若维数n和各维的长度合法,则构造相应的数组A,并返回TRUE。 DestroyArray(A):销毁数组A。 GetValue(A,e, index1,…, indexn):用e返回数组A中由index1,…, indexn所指定的元素的值。 SetValue(A,e,index1, …, indexn):将数组A中由index1, …, indexn所指定的元素的值置为e。 5.1 数组的逻辑结构

2. 三角矩阵和带状矩阵的压缩存储

5.2.1 背景 对于一些特殊矩阵,存储全部元素将是浪费空间,因此需要压缩存储。压缩的策略主要是两条: 为多个相同的非零元素只分配一个存储空间 对零元素不分配空间 本学习点学习三角矩阵和带状矩阵等两类矩阵的压缩存储。 5.2 三角矩阵和带状矩阵的压缩存储

5.2.2 三角矩阵 三角矩阵大体分为三类:下三角矩阵、上三角矩阵和对称矩阵。 下三角矩阵中,它的上三角(不包括主角线)中的元素均为常数c(经常c=0)。上三角矩阵与下三角矩阵相反。 5.2 三角矩阵和带状矩阵的压缩存储

5.2.3 三角矩阵 压缩存储思想:只存储下三角的元素(下面采用行优先) 原矩阵 5.2 三角矩阵和带状矩阵的压缩存储

5.2.3 三角矩阵 aij的位置 5.2 三角矩阵和带状矩阵的压缩存储

5.2.3 三对角带状矩阵 压缩存储思想:存储带状区域元素 原矩阵 5.2 三角矩阵和带状矩阵的压缩存储

5.2.3 三对角带状矩阵 aij的位置 5.2 三角矩阵和带状矩阵的压缩存储

3. 稀疏矩阵的压缩存储——三元组表

5.3.1 背景 稀疏矩阵(sparse matrix)就是多数元素为0的矩阵。如果还是存储每个元素,可能是浪费空间。 为决定存储方式,引用一个指标——稀疏因子 =t/(m*n) ,其中t为非零元素个数。 稀疏矩阵的一般小于0.05 5.3 稀疏矩阵的压缩存储——三元组表

5.3.2 三元组表表示法 存储思想:只存储非零元素。 稀疏矩阵的压缩存储会失去随机存取功能(即不能依靠行号和列号就可以直接访问元素)。 三元组表:将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序依次存放。 5.3 稀疏矩阵的压缩存储——三元组表

5.3.2 三元组表的C语言定义 typedef struct { int row, col; //元素的行和列 int e;//元素值 }Triple; //定义“三元组” //存非零元素的数组,data[0]一般不用 Triple data[101]; //矩阵的行数、列数和非零元素个数 int m,n,len; }TSMatrix;//定义“三元组表” 5.3 稀疏矩阵的压缩存储——三元组表

5.3.3 三元组表的评价 优点:三元组表节约了存储空间。但是,矩阵中非0元素超过1/3(即>1/3)就不再节省空间了。 缺点:与正常的存储方式来讲,增加了相关算法的难度。这是以时间换空间。 5.3 稀疏矩阵的压缩存储——三元组表

dest[i][j]=source[j][i]; 5.3.4 转置算法 一般矩阵的转置 for(i=0; i<m; i++) for(j=0; j<n; j++) dest[i][j]=source[j][i]; 算法复杂度:O(A.m×A.n) 5.3 稀疏矩阵的压缩存储——三元组表

5.3.4 转置算法 三元组表矩阵的转置动画 5.3 稀疏矩阵的压缩存储——三元组表

5.3.4 转置算法 三元组表矩阵的转置实例 A B 按照A中第1列、第2列、…顺序,也就是B中第1行、第2行、…顺序找遍A中全部元素 算法复杂度:O(A.n×A.len) n是A的列数 5.3 稀疏矩阵的压缩存储——三元组表

5.3.4 转置算法 三元组表矩阵的快速转置算法(从A转置到B) 第一步:遍历三元组表A,计算出A中第col列(也就是B中第col行)中元素个数,存入数组num[ ],从而可以计算出B中每行的开始位置,存入数组position[], 比如position[col]存放B中第col行第一个元素的位置。 第二步:再次遍历三元组表A,依次把A中的元素,按照行列互换,直接放到B的正确位置上。 5.3 稀疏矩阵的压缩存储——三元组表

5.3.4 转置算法 三元组表矩阵的快速转置算法 A B A中的列,B中的行 A中每列/B中每行的元素个数 B中每行首元素的存放位置 5.3 稀疏矩阵的压缩存储——三元组表

4. 稀疏矩阵的压缩存储——十字链表

5.4.1 背景 为什么用十字链表表示法? 三元组表的转置和乘法算法时间复杂度与正常存储矩阵相当,但是三元组表的加减法算法效率不佳,因为加减中非零元素的位置和个数会发生很大的变化导致三元组表中大量移动元素。 5.4 稀疏矩阵的压缩存储——十字链表

5.4.2 定义 在十字链表中,矩阵的每一个非零元素用一个结点表示 行号 列号 元素值 向下的指针 向右的指针 5.4 稀疏矩阵的压缩存储——十字链表

5. 广义表

5.5.1 背景 广义表是线性表的扩展:数据元素不属于同一类型。因此,严格地说,广义表是一种非线性结构。 广义表被广泛地应用于人工智能等领域的表处理语言LISP语言中。 5.5 广义表

5.5.2 广义表定义 广义表是n个数据元素(d1,d2,d3,…,dn)的有限序列。广义表中的di既可以是单个元素(又称为原子),还可以是一个广义表。 d1是广义表GL的表头,而广义表GL其余部分组成的表(d2,d3,…,dn)称为广义表的表尾。 通常记作:GL=(d1,d2,d3,…,dn)或GL(d1,d2,d3,…,dn) 为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。 5.5 广义表

5.5.2 广义表实例 D=()空表;其长度为零。该广义表也可记为D()。 A=(a,(b,c))表长度为2的广义表,其中第一个元素是单个数据a,第二个元素是一个子表(b,c)。该广义表也可记为A(a,(b,c))。 B=(A,A,D)长度为3的广义表,其前两个元素为表A,第三个元素为空表D。该广义表也可记为B(A,A,D)。 C=(a,C)长度为2递归定义的广义表,C相当于无穷表C=(a,(a,(a,(…))))。该广义表也可记为C(a,C)。 head(A)=a 表A的表头是a。 tail(A)=((b,c))表A的表尾是((b,c))。广义表的表尾一定是一个表。 5.5 广义表

5.5.3 广义表图形表达 图中的分支结点对应广义表,叶子结点对应原子或空表 D=() A=(a,(b,c)) B=(A,A,D) C=(a,C) 图中的分支结点对应广义表,叶子结点对应原子或空表 5.5 广义表

5.5.4 广义表存储结构 方式一 (a)表结点 (b)原子结点 D=() A=(a,(b,c)) B=(A,A,D) C=(a,C) 表头指针 header pointer 表尾指针 tail pointer 方式一 (a)表结点 (b)原子结点 D=() A=(a,(b,c)) B=(A,A,D) C=(a,C) 5.5 广义表

5.5.4 广义表存储结构 方式二 (a)表结点 (b)原子结点 D=() A=(a,(b,c)) B=(A,A,D) C=(a,C) 表头指针 header pointer 兄弟指针 sibling pointer 方式二 (a)表结点 (b)原子结点 D=() A=(a,(b,c)) B=(A,A,D) C=(a,C) 5.5 广义表

总结