高级数据结构之猝死攻略(一)

从基础数据结构一路杀到高级数据结构,历尽虚脱,在此奖励自己一个女神,希望能继续坚持。

本文参考自:

张铭《数据结构与算法》

高级数据结构之猝死攻略(一)_第1张图片

目录

1 多维数组

1.1 用数组表示特殊矩阵

1.1.1 三角矩阵

1.1.2 对称矩阵

1.1.3 对角矩阵(diagonal matrix)

1.1.4 稀疏矩阵

1.1.5 稀疏矩阵的十字链表

2 广义表

L= (x0,x1,…,xi,…,xn-1)2.1 原子和子表

2.2 表头和表尾

2.3 结点结构

2.3.1 表示形式一

2.3.2 表示形式二

2.3.3 M元多项式的表示

2.4 广义表的深度

2.5 广义表的各种类型

2.5.1 纯表(pure list)

2.5.2 可重入表

2.5.3 循环表(递归表)


1 多维数组

静态数组:必须在定义它的时候指定其大小和类型

动态数组:可以在程序运行才分配内存空间

多维数组 (Multi-array): 是向量的扩充,向量的向量就组成了多维数组

高级数据结构之猝死攻略(一)_第2张图片

1.1 用数组表示特殊矩阵

1.1.1 三角矩阵

下三角矩阵

高级数据结构之猝死攻略(一)_第3张图片

用一个长度为n(n+1)/2的1维数组A存储,{G00,G10,G11,……,Gn-1 0,…,Gn-1 n-1},
则Gij在A中对应的下标是:( i*(i+1)/2 + j )

上三角矩阵,Gij在A中对应的下标是:( j*(j+1)/2 +i )

1.1.2 对称矩阵

高级数据结构之猝死攻略(一)_第4张图片

对称矩阵的元素关于主对角线对称,只需存储矩阵中上三角或下三角中的元素,参考三角矩阵。

1.1.3 对角矩阵(diagonal matrix)

对角矩阵:主对角线之外的元素皆为0,常写为diag(a1,a2,...,an) 

然而,很多数据结构将对角矩阵定义为(至于哪个是对的,我目前也不太清楚)

高级数据结构之猝死攻略(一)_第5张图片

1.1.4 稀疏矩阵

高级数据结构之猝死攻略(一)_第6张图片

高级数据结构之猝死攻略(一)_第7张图片

1.1.5 稀疏矩阵的十字链表

单个节点

row:矩阵中的行。

col:矩阵中的列。

val:矩阵中的值。

right:指向右侧的一个非零元素(指向所在行的下一个元素)

down:指向下侧的一个非零元素(指向所在列的下一个元素)

高级数据结构之猝死攻略(一)_第8张图片

高级数据结构之猝死攻略(一)_第9张图片

高级数据结构之猝死攻略(一)_第10张图片

高级数据结构之猝死攻略(一)_第11张图片

高级数据结构之猝死攻略(一)_第12张图片

稀疏矩阵乘法时间代价

高级数据结构之猝死攻略(一)_第13张图片

2 广义表

推荐:http://data.biancheng.net/view/19.html

高级数据结构之猝死攻略(一)_第14张图片

单纯想放个图,缓解下。

广义表 (Generalized Lists,也称Multi-list):一个线性表中包括一个或者多个子表,又称为列表,记作

L= (x0,x1,…,xi,…,xn-1)
2.1 原子和子表

在广义表中,单个元素被称为 “原子”;包含的广义表被称为 “子表”。
例如:

 A = ()  :广义表A 为空表,长度为 0

B = (e)  :广义表 B 中只有一个原子 e ,长度为 1

C = (a,(b,c,d)) :广义表 C 中有两个元素,原子 a 和子表 (b,c,d) ,长度为 2

D = (A,B,C) :广义表 D 中有三个元素:子表 A、B、C,长度为 3 ,这种表示方式等同于: D = ((),(e),(b,c,d))

E = (a,E)  :广义表 E 中有两个元素,原子 a 和它本身,长度为 2 。这是一个递归的表,等同于:E = (a,(a,(a,…)))

A = () 和 A = (()) 是不一样的:前者是空表,长度为 0 ;后者表的长度为 1 ,包含的元素是一个子表,只不过这个子表是空表

2.2 表头和表尾

当广义表不为空时,称表中的第一个元素为表的 “表头” 剩余所有元素组成的表为 “表尾” 

上边例子中的 D = (A,B,C) ,子表 A 为广义表 D 的表头;而 (B,C) 组成的表为 D 的表尾

2.3 结点结构

2.3.1 表示形式一

由于广义表中的数据元素类型分为原子和子表,难以使用顺序存储结构表示,所以通常采用链式存储结构
原子:标志位 + 值域

子表:标志位 + 指向表头的指针域 hp+ 指向表尾的指针域tp

例如.....................................................................................................................................

C = (a,(b,c,d))

高级数据结构之猝死攻略(一)_第15张图片

一般标志位为1,表示子表标志位为0,表示原子

2.3.2 表示形式二

原子:标志位 + 值域 + 指向下一个数据元素的指针域tp

子表:标志位 + 指向表头的指针域 hp+ 指向下一个数据元素tp

例如.....................................................................................................................................

C = (a,(b,c,d))

高级数据结构之猝死攻略(一)_第16张图片

2.3.3 M元多项式的表示

少说废话,多消化栗子

高级数据结构之猝死攻略(一)_第17张图片

有一个三元多项式(三个变量x,y,z),如下:

多项式进行变形:

此时,P(x,y,z)可以表示为:


经过两轮转化后,P这个 3 元多项式分解成了由 A 多项式和 B 多项式组成的一元多项式(只有一个变元 z ),而 A 也变成了由 C 多项式和 D 多项式组成的一元多项式。


当全部转化成能用一元多项式表示时,每一个一元多项式只需要存储各项的指数和系数就可以了。

高级数据结构之猝死攻略(一)_第18张图片

exp:存放指数

coef:存放多项式的系数

hp:指向表头的指针域

tp:指向下一个数据元素

2.4 广义表的深度

广义表的深度:广义表中括号的重数

例如:..............................................................................................................

C=(a,(b,c,d))

高级数据结构之猝死攻略(一)_第19张图片

从前往后数左括号的数量就是广义表C的深度,为2;也可以从右往左数右括号的数量(红色)

2.5 广义表的各种类型

2.5.1 纯表(pure list)

高级数据结构之猝死攻略(一)_第20张图片

2.5.2 可重入表

2.5.3 循环表(递归表)

E = (a,E:广义表 E 中有两个元素,原子 a 和它本身,长度为 2 。这是一个递归的表,等同于:E = (a,(a,(a,…)))。

通俗的来说,就是自己包含自己

高级数据结构之猝死攻略(一)_第21张图片

当你以为马上就要学完的时候,其实还有

《高级数据结构之猝死攻略(二)》:https://blog.csdn.net/wydyd110/article/details/82225499

你可能感兴趣的:(Data,Structure)