第2章 数组结构
前言
几乎所有的程序设计语言中,都包含数组(Array)数据结构。一个数组元素可以表示成一个索引和名称,并且存储在相邻的计算机内存中,属于一种典型的线性表,当多个性质相同的是数据需要处理时,都可以使用数组方式存放数据。
2.1 线性表
我们先来认识线性表。线性表或称为有序表,是数学概念应用在计算机科学中一种相当基本的数据结构。简单地说,线性表是n个元素的有限序列(n>=0),如26个英文字母的字母表:A,B,C,D,E,…,Z就是一个线性表。
2.1.1线性表定义
2.1.2线性表在计算机中的应用
- 静态数据结构
- 动态数据结构
2.2 认识数组
![](https://i-blog.csdnimg.cn/blog_migrate/45972362557f4544b7b5e276f9259487.png)
2.2.1一维数组
![](https://i-blog.csdnimg.cn/blog_migrate/500ffc6087eba6b70b3ae658a46678bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c7ef44a9dc7c5a5d551c844d98bb0ef6.png)
2.2.2二维数组
![](https://i-blog.csdnimg.cn/blog_migrate/b99ad74095c0bda3c7a06ae0f37b096c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/88cafa1500ee39e9daf71e79eb119c1e.png)
2.2.3三维数组
![](https://i-blog.csdnimg.cn/blog_migrate/a686d237c491e3b0dc0b4bed81154d3a.png)
2.2.4n维数组
2.2.5Arrays类实现
![](https://i-blog.csdnimg.cn/blog_migrate/d851e05fc4631a5aae284715b7b4a3d4.png)
2.3 矩阵的简介与运算
基本上,数学中的矩阵是用来描述二维数组的最好方式,例如A为3*3的矩阵,也就是有3行和3列,如下所示。
![](https://i-blog.csdnimg.cn/blog_migrate/2be242af8aaf11fef221114a59b130d2.png)
对于上面的A矩阵,我们是不是会马上想到了一个声明为A(1:3,1:3)的二维数组。许多矩阵的运算与应用,都可以使用计算机中的二维数组解决,例如两个矩阵的相加、相乘,或是某些稀疏矩阵、转置矩阵、上三角矩阵与下三角矩阵等。
2.3.1矩阵相加
![](https://i-blog.csdnimg.cn/blog_migrate/b84c11acc7a864d32c3f24beb8bbc6f5.png)
2.3.2矩阵相乘
![](https://i-blog.csdnimg.cn/blog_migrate/bf7ebdd314ba7dccdfe9327afbb8495f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eb48f9f2321351328a9af625c4c58889.png)
2.3.3转置矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/d560335e0f35463b51ccaac7880bbc09.png)
2.3.4稀疏矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/08f049133eb6e40b3069156453c28c96.png)
![](https://i-blog.csdnimg.cn/blog_migrate/665683c9138d8b64a2e47fd25f7133c8.png)
2.3.5上三角形矩阵
- 右上三角形矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/590bb80e3b6a457debe471941c3b3956.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c6e97a731137e9d9a97eeb388c806087.png)
![](https://i-blog.csdnimg.cn/blog_migrate/93727a4ebfb0a975640e89416bb0ef92.png)
- 左上三角形矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/9ddfd2c7d9f4bc923fe2d68e885c6e77.png)
![](https://i-blog.csdnimg.cn/blog_migrate/68fd4e9a33772c0f7ee4d5805e894818.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2cbb5fdafcf875d670130c8136103aaf.png)
2.3.6下三角形矩阵
- 左下三角形矩阵
- 右下三角形矩阵
2.4 数组与多项式
多项式是数学中相当重要的表现方式,通常如果使用计算机来处理多项式的各种相关运算,可以将多项式以数组或链表的形式来存储,我们主要学习多项式以数组结构方式表示的相关应用。
2.4.1认识多项式
2.4.2多项式的加法
小结
- 线性表是n个元素的有限序列(n>=0),如26个英文字母列表就是一个线性表。
- 线性表按照内存存储的方式,可分为两种:静态数据结构(static data structure)、动态数据结构(dynamic data structure)。
- 静态数据结构或称为“密集表”(dense list),它将有序列表的数据使用连续存储空间(contiguous allocation)来存储。
- 动态数据结构又称为“链表”(linked list),它将线性表的数据使用不连续存储空间来存储。
- “指针变量”(pointer variable)是指内含值为指到内存存储位置的一种数据类型的变量。
- 数组结构类型通常包含5种属性:起始地址、维度(dimension)、索引上下限、数组个数、数组类型。
- α为A数组在内存中的起始位置,d为每一个数组元素所占用的空间,那么数组元素与内存地址有以下关系:Loc(A(i))=α+(i-1)×d。
- Java语言中二维数组声明方式如下:
数据类型[ ][ ] 变量名称=new 数据类型[第一维长度][第二维长度];
- 以行为主(Row-major):假设α为数值A在内存中的起始地址,d为单位空间,那么数组元素A(i,j)与内存地址与以下关系:
Loc(A(i,j))=α+n×(i-1)×d+(j-1)×d
- 以列为主(Column-major):数组元素A(i,j)与内存地址有以下关系:
Loc(A(i,j))=α+(i-1)×d+m×(j-1)×d
- Java语言中三维数组声明方式如下:
数据类型[ ][ ][ ] 变量名称=new 数据类型[第一维长度][第二维长度][第三维长度];
- Java中的Arrays类提供许多对于数组的处理方法,比如排序、查找、复制、填充及比较等。
- 假设A为m×n矩阵,则A^t 为n×m矩阵,对每一个A(i,j)=A^t (j,i),则称A^t 为A的转置矩阵。
- 稀疏矩阵最简单的定义就是,一个矩阵中大部分的元素为0即可称为“稀疏矩阵”(Sparse Matrix)。
- 上三角形矩阵(Upper Trangular Matrix)就是一种对角线以下皆为0的n×n矩阵,其中又可分为右上三角形矩阵(Right Upper Trangular Matrix)与左上三角形矩阵(Left Upper Trangular Matrix)。
- 下三角形矩阵(Lower Trangular Matrix)是一种对角线以上元素皆为0的n×n矩阵,其中又可分为左下三角形矩阵(Left Lower Trangular Matrix)和右下三角形矩阵(RightLower Trangular Matrix)。