您的位置:首页 > 理论基础 > 数据结构算法

面试---数据结构(2)(数组)

2017-07-29 08:53 204 查看
数组的定义

所谓数组,是无序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。

数组是一种线性结构顺序表

特点:

1.数组是相同数据类型的元素的集合

2.数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起

3.数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

对于VB的数组,表示数组元素时应注意;

1下标要紧跟在数组名后,而且用圆括号括起来(不能用其他括号)

2下标可以是常量,变量,或表达式,但其值必须是整数(如果是小数将四舍五入为整数)

3下标必须为一段连续的整数,其最小值成为下界,其最大值成为上界。不加说明时下界值默认为1

数组中元素与结构或类中的字段的区别

数组中的所有元素都具有相同类型(这一点和结构或类中的字段不同,它们可以是不同类型)。数组中的元素存储在一个连续性的内存块中,并通过索引来访问(这一点也和结构和类中的字段不同,它们通过名称来访问)。

类型

数组元素并非只能是基元数据类型。还可以是结构、枚举或类。

数组的结构形式

栈内存

在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码中定义一个变量时,java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,java会自动释放掉为该变量所分配的内存空间

堆内存

堆内存用来存放由new运算符创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。在堆中创建了一个数组或对象后,同时还在栈内存中定义一个特殊的变量。让栈内存中的这个变量的取值等于数组或者对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。

数组类型

1,一维数组:一维数组是最简单的数组,其逻辑结构是线性表

他的逻辑结构是线性结构,存储结构是顺序存储结构

例如:a[i]

2,二维数组:

形式:类型说明符数组名[常量表达式1][常量表达式2]…;

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度

例如:int a[3][4]; 说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3]

3,多维数组

例如“int a[][][][]…

要注意的是数组里存放的类型是多种多样的,有整型int,字符型string,浮点型float等等

特殊例题:

1.一维数组求地址的公式:Loc(a[i])=Loc(a[0])+i*C

其中C为每个元素存储空间的字节数。int类型为2个字节,一个字母是一个字节,一个字是4个字节

2.对于二位数组,有行优先顺序和列优先顺序两种不同的存储方式

3对于一个二维数组A[m]
,若采取按行存放,则任一数组元素A[i][j]相对于A[0][0]的地址为(i*n+j)*C

C为每个元素占用存储空间的字节数

扩展

1.稀疏矩阵:

基本定义:矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,则称该矩阵为稀疏矩阵(sparse matrix);与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对称矩阵),则称该矩阵为特殊矩阵。

突出优点:稀疏矩阵的计算速度更快,因为M AT L A B只对非零元素进行操作,这是稀疏矩阵的一个突出的优点.

假设矩阵A,B中的矩阵一样.计算2*A需要一百万次的浮点运算,而计算2*B只需要2 0 0 0次浮点运算.

对于一个用二维数组存储的稀疏矩阵Amn,如果假设存储每个数组元素需要L个字节,那么存储整个矩阵需要m*n*L个字节.但是,这些存储空间的大部分存放的是0元素,从而造成大量的空间浪费.为了节省存储空间,可以只存储其中的非0元素.

对于矩阵Amn的每个元素aij,知道其行号i和列号j就可以确定其位置.因此对于稀疏矩阵可以用一个结点来存储一个非0元素.该结点可以定义如下:

[i,j,aij]

该结点由3个域组成,i:行号,j:列号;aij元素值.这样的结点被称为三元组结点.矩阵的每一个元素Qij,由一个三元组结点(i,j,aij)唯一确定.

例如稀疏矩阵A:

50 0 0 0

10 0 20 0

0 0 0 0

-30 0 -60 5

其对应的三元组表为:

1 1 50

2 1 10

2 3 20

4 1 -30

4 3 -60

4 4 5

存储空间

一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存.如果Matlab把一个矩阵当作稀疏矩阵,那么只需在m×3的矩阵中存储m个非零项.第1列是行下标,第2列是列下标,第3列是非零元素值,不必保存零元素.如果存储一个浮点数要8个字节,存储每个下标要4个字节,那么整个矩阵在内存中存储需要1 6×m个字节.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法 面试