第五章 数组和 广义表 数组 稀疏矩阵 广义表.

Slides:



Advertisements
Similar presentations
数据结构 杨鹏宇 QQ: 版权所有,转载或翻印必究
Advertisements

数据结构算法 模拟练习及解答二 绍兴文理学院 计算机系计算机应用教研室.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
权力的行使:需要监督 北京市京源学校 冯 悦.
数据结构与算法 数据结构与算法实验
专题研讨课二: 数组在解决复杂问题中的作用
Chapter 3.0 C語言的結構與指標 資料結構導論 - C語言實作.
Chapter 7 Search.
單向鏈結串列 Singly Linked Lists.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
C语言程序设计 第十二章 位运算.
程式設計 博碩文化出版發行.
資料結構 第5章 佇列.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
第八章 图 图的基本概念 图的存储结构 图的遍历与连通性 最小生成树 最短路径 活动网络.
结构体和共用体 2 梁春燕 华电信息管理教研室.
第五章 数组和广义表.
第5章 语义分析(Semantic Analysis)
Array & General List.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第2章 线性表 2.1 线性表的基本概念 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 线性表的应用 2.5 有序表 本章小结.
第十三章 其他的C語言課題.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
数据结构 第5章 数组与广义表.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
張智星 清大資工系 多媒體檢索實驗室 第九章: 矩陣的處理與運算 張智星 清大資工系 多媒體檢索實驗室.
1.1 数据结构讨论的范畴 1.2 基本概念 1.3 算法和算法的量度.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第 3 讲 线性表(一).
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
第三章 栈和队列.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
資料結構 第4章 堆疊.
Chapter4 Arrays and Matrices
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
排列组合 1. 两个基本原理 分类加法计数原理 分步乘法计数原理.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
王玲 第 2 章 线性表 王玲 2019/2/25.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 字符串应用 5.4 字符串匹配算法 5.5 数组
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第6章 数组与广义表 6.1 数组的定义及其基本操作 6.2 数组的顺序存储结构 6.3 矩阵的压缩存储 6.4 广义表的概念
陣列 (Array)      授課老師:蕭志明.
第二章 数组 作为抽象数据类型的数组 顺序表 多项式抽象数据类型 稀疏矩阵 字符串 小结.
第三节 常见天气系统.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 字符串应用 5.4 字符串匹配算法 5.5 数组
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
3.3 用中规模集成电路设计其他的组合逻辑电路 返回 用数据选择器设计组合逻辑电路 用译码器设计组合逻辑电路
树和二叉树(一).
1.1算法的概念.
資料結構簡介 綠園.
第 六 讲 栈和队列(一).
本 章 说 明 5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的存贮结构
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
本节内容 指针类型.
Ch.5 数组和广义表 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第2章 陣列結構 資料結構設計與C++程式應用
第7章 图.
C++程序语言设计 Chapter 14: Templates.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言基础学习 从外行到入门.
Presentation transcript:

第五章 数组和 广义表 数组 稀疏矩阵 广义表

数 组 一维数组 定义 相同类型的数据元素的集合。 一维数组的示例 0 1 2 3 4 5 6 7 8 9 数 组 一维数组 定义 相同类型的数据元素的集合。 一维数组的示例 0 1 2 3 4 5 6 7 8 9 35 27 49 18 60 54 77 83 41 02

数组的定义和初始化 main ( ) { int a1[3] = { 3, 5, 7 }, *elem; for ( int i = 0; i < 3; i++ ) printf ( “%d”, a1[i], “\n” ); //静态数组 elem = a1; for ( int i = 0; i < 3; i++ ) { printf ( “%d”, *elem, “\n” ); //动态数组 elem++; }

LOC(i) = LOC(i-1)+l = a+i*l LOC(i) = LOC(i-1)+l = a+i*l, i > 0 一维数组存储方式 35 27 49 18 60 54 77 83 41 02 0 1 2 3 4 5 6 7 8 9 l l l l l l l l l l LOC(i) = LOC(i-1)+l = a+i*l LOC(i) = LOC(i-1)+l = a+i*l, i > 0 a, i = 0 a+i*l a

二维数组 LOC ( i, j ) = a + ( i * m + j ) * l 行优先存放: 设数组开始存放位置 LOC( 0, 0 ) = a, 每个元素占用 l 个存储单元 LOC ( i, j ) = a + ( i * m + j ) * l

三维数组 各维元素个数为 m1, m2, m3 LOC ( i1, i2, i3 ) = a + (按页/行/列存放) LOC ( i1, i2, i3 ) = a + ( i1* m2 * m3 + i2* m3 + i3 ) * l 前i1页总 元素个数 第i1页的 前i2行总元素个数

( i1*m2*m3*…*mn + i2*m3*m4*…*mn+ + ……+ in-1*mn + in ) * l 各维元素个数为 m1, m2, m3, …, mn 下标为 i1, i2, i3, …, in 的数组元素的存储地址: LOC ( i1, i2, …, in ) = a + ( i1*m2*m3*…*mn + i2*m3*m4*…*mn+ + ……+ in-1*mn + in ) * l

行向量 下标 i 页向量 下标 i 列向量 下标 j 行向量 下标 j 列向量 下标 k 二维数组 三维数组 行向量 下标 i 页向量 下标 i 列向量 下标 j 行向量 下标 j 列向量 下标 k

特殊矩阵的压缩存储 特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵。 特殊矩阵的压缩存储主要是针对阶数很高的特殊矩阵。为节省存储空间,对可以不存储的元素,如零元素或对称元素,不再存储。 对称矩阵 三对角矩阵

对称矩阵的压缩存储 设有一个 nn 的对称矩阵 A。 在矩阵中,aij = aji

把它们按行存放于一个一维数组 B 中,称之为对称矩阵 A 的压缩存储方式。 为节约存储空间,只存对角线及对角线以上的元素,或者只存对角线及对角线以下的元素。前者称为上三角矩阵,后者称为下三角矩阵。 把它们按行存放于一个一维数组 B 中,称之为对称矩阵 A 的压缩存储方式。 数组 B 共有 n + ( n - 1 ) +  + 1 = n*(n+1)/2 个元素。

上三角矩阵 下三角矩阵

下三角矩阵 B a00 a10 a11 a20 a21 a22 a30 a31 a32 …… an-1n-1 若 i  j, 数组元素A[i][j]在数组B中的存放位置为 1 + 2 +  + i + j = (i + 1)* i / 2 + j 前i行元素总数 第i行第j个元素前元素个数

若 i < j,数组元素 A[i][j] 在矩阵的上三角部分, 在数组 B 中没有存放,可以找它的对称元素A[j][i]:= j 若 i < j,数组元素 A[i][j] 在矩阵的上三角部分, 在数组 B 中没有存放,可以找它的对称元素A[j][i]:= j *(j +1) / 2 + i

上三角矩阵 n = 4 0 1 2 3 4 5 6 7 8 9 B a00 a01 a02 a03 a11 a12 a13 a22 a23 a33 若i  j,数组元素A[i][j]在数组B中的存放位置为 n + (n-1) + (n-2) +  + (n-i+1) + j-i 前i行元素总数 第i行第j个元素前元素个数

若 i  j,数组元素A[i][j]在数组B中的存放位置为 n + (n-1) + (n-2) +  + (n-i+1) + j-i = = (2*n-i+1) * i / 2 + j-i = = (2*n-i-1) * i / 2 + j 若i > j,数组元素A[i][j]在矩阵的下三角部分,在数组 B 中没有存放。因此,找它的对称元素A[j][i]。 A[j][i]在数组 B 的第 (2*n-j-1) * j / 2 + i 的位置中找到。

三对角矩阵的压缩存储 B a00 a01 a10 a11 a12 a21 a22 a23 … an-1n-2 an-1n-1 0 1 2 3 4 5 6 7 8 9 10 B a00 a01 a10 a11 a12 a21 a22 a23 … an-1n-2 an-1n-1

三对角矩阵中除主对角线及在主对角线上 下最临近的两条对角线上的元素外,所有其它元素均为0。总共有3n-2个非零元素。 将三对角矩阵A中三条对角线上的元素按行存放在一维数组 B 中,且a00存放于B[0]。 在三条对角线上的元素aij 满足 0  i  n-1, i-1  j  i+1 在一维数组 B 中 A[i][j] 在第 i 行,它前面有 3*i-1 个非零元素, 在本行中第 j 列前面有 j-i+1 个,所以元素 A[i][j] 在 B 中位置为 k = 2*i + j。

稀疏矩阵 (Sparse Matrix) 非零元素个数远远少于矩阵元素个数

稀疏矩阵的抽象数据类型 template<class Type> class SparseMatrix; template<class Type> class Trituple { //三元组 friend class SparseMatrix <Type> private: int row, col; //非零元素行号/列号 Type value; //非零元素的值 } template <class Type> class SparseMatrix { //稀疏矩阵类定义

int Rows, Cols, Terms; //行/列/非零元素数 Trituple<Type> smArray[MaxTerms]; public: //三元组表 SparseMatrix (int MaxRow, int Maxcol); SparseMatrix<Type>& Transpose (SparseMatrix<Type>&); //转置 SparseMatrix<Type>& Add (SparseMatrix <Type> a, SparseMatrix<Type> b); //相加 SparseMatrix<Type>& Multiply(SparseMatrix <Type> a, SparseMatrix<Type> b); //相乘 }

稀疏矩阵

转置矩阵

假设以三元顺序存储结构来表示三元表,可得稀疏矩阵的一种压缩存储方式——三元组顺序表。 //------稀疏矩阵的三元组顺序表存储表示-----//

#define MAXSIZE 12500//假设非零元素////的个数的最大值为12500 Typedef struct { int i,j; //该非零元素的行下标和列下标 ElemType e; } Triple; Typedef struct{ Triple data[MAXSIZE+1];; int mu,nu,tu;//矩阵的行数、列数和非零元素个数 }TSMatrix;

两个矩阵实现转制: (1)将矩阵的行列值相互交换; (2)将每个三元组的i和j相互调换; (3)重排三元组之间的次序便可实现矩阵的转制.

按照b. data中三元组次序依次在a. data中找到相应的三元组进行转换. 换句话说,按照矩阵的M的列序来进行转制 按照b.data中三元组次序依次在a.data中找到相应的三元组进行转换.换句话说,按照矩阵的M的列序来进行转制.为了找到M的每一列所有的非零元素,需要对其三元组标的a.data从第一行起整个扫描一遍,由于a.data是以M的行序为主序来存放每个非零元的,由此得到的恰是b.data应有的顺序.

Status TransposeSmtrix(TSMatrix M,TSMatrix &T){ T.mu=M.nu; T.nu=M.nu; T.tu=M.tu; if(T.tu){ q=1; for(col=1;col<=M.nu;++col) for(p=1;p<=M.tu;++p) if(M.data[p].j==col){ T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; }

广义表 (General Lists ) 限序列,记作 LS = (a0, a1, a2, …, an-1) LS是表名,ai是表元素,它可以是表 (称 为子表),可以是数据元素(称为原子)。 n为表的长度。n = 0 的广义表为空表。 n > 0时,表的第一个表元素称为广义表 的表头(head),除此之外,其它表元素组 成的表称为广义表的表尾(tail)。

例如 A=( ); //A是一个空表 B=(e); //表B有一个原子 C=(a,(b,c,d)); //两个元素为原子a和子表 (b,c,d) D=(A,B,C); //有三个元素均为列表 E=(a,E); //递归的列表

从上述定义和例子可推出列表的3个重要结论: (1)列表的元素可以是子表,而子表的元素还可以是子表 (2)列表可为其他列表所共享. (3)列表可以是一个递归的表,即列表也可以是其本身的一个子表.

GetHead(B)=e,GetTail(B)=() GetHead(D)=A;GetTail(D)=(B,C), 值得提醒的是列表()和(())不同.前者为空表,长度n=0;后者长度n=1,可分解得到其表头,可分解得到其表头,表尾均为空表().

广义表存储结构 表结点 Tag=1 hp tp 原子结点 Tag=0 atom typedef struct GLNode{ int tag; union{ char atom; struct {structGLNode hp,*yp;}ptr; }; }

方法一 A=NIL E  1 D B C 0 e 0 a 0 b 0 c 0 d

方法二 E  1 D B C 0 a 0 e 0 b 0 c 0 d A