第05章 数组和广义表(java版)

32
数数数数 Java 数 )( 3数第5第 第第第第第第 5.1 第第 5.2 第第第第第第第第第 5.3 第第第

Upload: yan-li

Post on 27-Jul-2015

330 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

第 5 章 数组和广义表

5.1 数组 5.2 特殊矩阵的压缩存储 5.3 广义表

Page 2: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

目的和要求• 目的:线性结构到非线性结构的过渡,了解包含子结构

的线性结构,理解链式存储结构在表达非线性数据结 构中的作用。

• 内容:使用二维数组表示矩阵及运算;三角矩阵、对称矩阵、稀疏矩阵等各种压缩存储方法实现矩阵运算;

广 义表的概念、双链表示和实现。• 要求:理解多维数组的存储结构;熟悉特殊矩阵的压缩存

储方法;掌握稀疏矩阵三元组从顺序表、行的单链表 到十字链表等到多种存储结构的演变过程;理解广义 表的概念,熟悉广义表的存储结构。

• 重点:讨论多种由顺序存储结构和链式存储结构有机结合的存储结构,以矩阵为例,研究在相同的逻辑结构(矩阵)和操作要求(矩阵运算)情况下,根据各

种 矩阵的不同特性,采用多种存储结构实现矩阵运算。• 难点:稀疏矩阵的多种存储和实现,广义表的存储和

实现。• 实验:特殊矩阵和广义表的存储和运算。

Page 3: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.1 数组5.1.1 一维数组 Loc(ai)= Loc(a0)+ i ×c

5.1.2 多维数组 ( 1 )静态顺序存储

行主序

列主序 cjniaLocaLoc ij )()()( 00

cimjaLocaLoc ij )()()( 00

Page 4: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

( 2 )动态二维数组的存储结构

element[0]

element[1]

element[m-1]

element a00 a01

a10 a11

… a0,n-1

… a1,n-1

am-1,0 am-1,1

… am-1,n-1

数组名 … n-10 1数组第一维

element[i][j]

… … …

Page 5: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

【例 5.1 】 矩阵类。

设 ,有设 ,有设 ,有

设 ,有

00 01 0, 1

10 11 1, 1

1,0 1,1 1, 1

¡

¡

¡ ¡ ¡ ¡

¡

n

nm n

m m m n

a a a

a a a

a a a

A

nmnmnm BAC ijijij bac

nmnmnm BAC ijijij bac

lnnmlm BAC

1

0

)(n

kkjikij bac

的转置矩阵nmmn AT jiij at

Page 6: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.2 特殊矩阵的压缩存储5.2.1 三角矩阵、对称矩阵和对角矩阵

的压缩存储

5.2.2 稀疏矩阵的压缩存储

Page 7: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.2.1 三角矩阵、对称矩阵和对角矩阵的压缩存储 1. 三角矩阵的压缩存储( 1 )线性压缩存储三角矩阵

1,12,11,10,1

2,21,20,2

1110

00

0

00

000

nnnnnn

nnnn

nn

aaaa

aaa

aa

a

A

nijjii

a

jiaaij

02

)1()(Loc

21)(Loc)(Loc

00

00

Page 8: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

( 1 )线性压缩存储上三角矩阵

1,1

1,22,2

1,12,111

1,02,00100

000

00

0

nn

nnnn

nn

nn

nn

a

aa

aaa

aaaa

A

njijini

a

ijinnnaaij

02

)12()(Loc

)1()1()(Loc)(Loc

00

00

Page 9: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

( 2 )使用三角形的二维数组压缩存储三角矩阵

Page 10: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 对称矩阵的压缩存储

njiijj

a

nijjii

aaij

02

)1()(Loc

02

)1()(Loc

)(Loc

00

00

jiij aa

Page 11: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

3. 对角矩阵的压缩存储

1,1

11

00

00

00

00

nn

nn

a

a

a

A

1,11,2

1,22,2

2221

121110

0100

000

000

000

00

000

nnnn

nnnn

nn

aa

aa

aa

aaa

aa

A

Page 12: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.2.2 稀疏矩阵的压缩存储

1. 表示稀疏矩阵的三元组

{(0,2,11), (0,4,17), (1,1,20), (3,0,19),(3,5,28), (4,4,50)}

5 6

0 0 11 0 17 0

0 20 0 0 0 0

0 0 0 0 0 0

19 0 0 0 0 28

0 0 0 0 50 0

A

行号 列号 元素值row colum

nvalue

Page 13: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 稀疏矩阵三元组顺序表

( 1 )稀疏矩阵三元组顺序表类 public class SeqSparseMatrix{ int rows, columns; // 矩阵行数、列数 SeqList<Triple> list; // 三元组顺序表}

list

65

rows columns

smata 0 2 11

0 4 17

0

1

2

3

4

5

1 1 20

3 0 19

3 5 28

4 4 50

row column value

Triple

element

6

len

Page 14: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 稀疏矩阵三元组顺序表

( 2 )获得或设置稀疏矩阵元素值( 3 )稀疏矩阵描述字符串 ( 4 )稀疏矩阵相加 【例 5.2 】三元组顺序表表示的稀疏矩阵

及其加法运算。

Page 15: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

3. 稀疏矩阵三元组单链表

0 2 11 0 4 17 1 1 20 3 5 28 4 4 50

row column value

nextlist

65

rowscolumns

smat

data

Triple

Page 16: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

4. 稀疏矩阵行的单链表

( 1 )稀疏矩阵三元组行的单链表类public class LinkedSparseMatrix{ int rows, columns; // 矩阵行数、列数 SeqList<PolySLinkedList<Triple>> list; // 行指针顺序表,元素是多项式排序单链表}

∧4 170

1

2

3

4

∧1 20

5 28

4 50

0

0 2 11

row column value nextlist

65

rows columns

smat

1

3

4

(Triple)data

element

6

len

Page 17: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

4. 稀疏矩阵行的单链表

( 2 )获得或设置稀疏矩阵元素值( 3 )稀疏矩阵描述字符串 ( 4 )稀疏矩阵相加 ( 5 )深度拷贝及应用

Page 18: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

( 6 )比较两个矩阵是否相等

∧4 170

1

2

3

4

∧1 20

5 28

4 50

0

0 2 11

row column value nextlist

65

rows columns

smat

1

3

4

(Triple)data

调用LinkedSparseMatrix类的equals(obj)方法 调用SeqList类的

equals(obj)方法

调用SinglyLinkedList类的equals(obj)方法 调用Triple类的equals(obj)方法

Page 19: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5. 十字链表

Page 20: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

十字链表存储的稀疏矩阵类public class CrossNode // 十字链表结点类{ Triple data; // 数据域表示三元

组 CrossNode right, down; //right 指向行的下

一个结点, down 指向列的下一个结点}public class CrossLinkedSparseMatrix { int rows, columns; // 矩阵行数、列数 CrossNode rowheads[],columnheads[]; // 行、列指针数组 }

Page 21: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.3 广义表

5.3.1 广义表抽象数据类型5.3.2 广义表的存储结构5.3.3 广义表双链表示的实现 5.3.4 m 元多项式的广义表表示

Page 22: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.3.1 广义表抽象数据类型1. 广义表定义 GList = (a0, a1,…, an-1)

中国 ( 北京 , 上海 , 江苏 ( 南京 , 苏州 ), 浙江 ( 杭州 ), 广东 ( 广州 )) L= (a, b) // 线性表,长度为 2 ,深度为 1T= (c, L)= (c, (a,b)) //L为 T 的子表, T 的长度为 2 ,深度为 2G = (d, L, T)= (d, (a, b), (c, (a, b))) //L、 T为G 的子表, G 的长度为 3 ,深度为 3S = () // 空表,长度为 0 ,深度为 1S1= (S)= (()) // 元素是一个空表,长度为 1 ,深度为 2Z = (e, Z)= (e, (e, (e, (…))))// 递归表, Z 的长度为 2 ,深度无穷

Page 23: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

带表名的广义表表示

L(a,b)T(c, L(a,b))G(d, L(a,b), T(c,

L(a,b)))S()S1(())Z(e, Z(e, Z(e, Z(…))))

Page 24: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 广义表的特性

( 1 )线性结构 ( 2 )多层次结构,有深度 ( 3 )可共享 ( 4 )可递归

Page 25: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

4. 广义表抽象数据类型 public interface GGenList<T>{ boolean isEmpty(); // 判断广义表是否空 int length(); // 返回广义表长度 int depth(); // 返回广义表深度 GenListNode<T> insert(int i, T x); // 插入原子 x 作为第 i 个元素 GenListNode<T> insert(int i, GenList<T>

glist); // 插入子表作为第 i 个元素 void remove(int i); // 删除第 i 个元素}

Page 26: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.3.2 广义表的存储结构1. 广义表的单链表示

Page 27: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 广义表的双链表示

Page 28: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

不带头结点的广义表双链表示对共享子表 L 进行头删除操作产生错误

G d ∧ L T ∧

datachildnext

L a ∧ b ∧ ∧

T c ∧ L ∧

(a)不带头结点的广义表双链表示

G d ∧ L T ∧

L b ∧ ∧ b ∧ ∧

T c ∧ L ∧

(b)对共享子表L进行头删除操作产生错误

a ∧没有改变

改变

Page 29: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.3.3 广义表双链表示的实现 1. 广义表双链表示的结点类 public class GenListNode<T> { T data; // 数据域 GenList<T> child; // 指向子表 GenListNode<T> next; // 指向后继结

点}

Page 30: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

2. 双链表示的广义表类 public class GenList<T> implements GGenList<T> { GenListNode<T> head; // 头指

针}例 5.3 广义表的双链表示及构造算法。

① 由原子数组构造广义表 ② 由广义表表示创建广义表

GGenList广义表接口

GenList广义表类

实现

Page 31: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

由“ (d, (a,b), (c,(a,b)))” 创建的广义表没有建立共享子表

G ∧ d ∧ ∧

datachildnext

∧ a ∧ b ∧ ∧

∧ c ∧ ∧

∧ a ∧ b ∧ ∧

Page 32: 第05章  数组和广义表(java版)

《数据结构( Java版)(第 3版)》

5.3.4 m 元多项式的广义表表示

53323204

53223334

8)26()26()315(

86622315),(

yyxxyxxyx

yyxyxyxyxxyxP

head∧

x 3

datachildnext

∧ 2∧

∧ ∧

x-6 2

data

1 y 0 1 y 1 1 y 3 8 y 5

系数 变量 指数

(项Term)

childnext

∧ ∧

x 4∧ -3∧x15 0 ∧ ∧