数据结构之数组结构(一)

来源:互联网 发布:android手机投影到mac 编辑:程序博客网 时间:2024/05/23 01:25

前面我们讨论了关于数据结构的一些基本概念了,对数据结构也有了一些初步的认识。今天我们来学习一下数组的数据结构,在学习之前,我们先来了解几个概念。

2.1线性表(Linear List)

线性表又称为有序列表。定义如下:

    ①:有序列表可以是空元素,或者可写成(a1,a2,,,,an)。    ②:存在唯一的第一个元素a1与存在唯一的最后一个元素an    ③:除了第一个元素a1外,每一个元素都有唯一的前驱(processor)。    ④:除了最后一个元素,每一个元素都有唯一的后继(successor)。

有序列表与相邻元素之间存在的关系。

①:计算列表的长度n。②:取出列表中的第i项元素来加以修正(0<=i<=n)③:插入一个新的元素到第i项,使得原来的第i,i+1,i+2.....,n项,后移变成i+1,i+2,i+3....,n+1项。④:删除第i项元素,使得原来的第i+1,i+2.....n项,前移变成第i,i+1,....,n-1项。⑤:从右到左或从左到右读取列表中各个元素的值⑥:在第i项存入新值,并取代旧值。⑦:复制列表。⑨:合并列表

静态数据结构(static data structure)

又成为“密集表(dense list)”:将有序列表的顺序使用连续分配空间来存储的。优点:设计简单,读取与修改列表中的任意元素时间固定缺点:加入与删除数据时,移动大量数据。而且运行时就要分配给相关变量内存,所以要事先声明最大的存储空间。**而动态数据结构在运行时才分配内存**

动态数据结构(dynamic data structure)

又成为“链接列表”:将线性表的数据使用不连续存储空间来存储。优缺点与静态相反。

2.2 数组

有了以上的概念后,我们接下来来看看数组。数组结构其实就是一排紧密相邻的可数内存,并提供一个能够直接访问单一数据内容的计算方法
他必须包含以下5种属性:

①:起始地址:表示数组名(或数组第一个元素)所在内存的起始地址。②:维度:代表此数组是几维数组。③:索引上下限:指数组在中,内存所存储位置的上下标。④:数组元素个数:索引上限-索引下限+1⑤:数组类型;声明数组的类型,决定数组元素在内存所占用的大小。

2.2.1一维数组

当java数组在声明时会在内存中分配一段暂存空间。空间的大小已声明的数据类型及数组数量为依据。
比如,我们声明了一个数组。int a=new int[10]。首先会分配出一段暂存空间。容量为:4*10=40(Byte)
如图:这里写图片描述

如果数组A的声明为A(1,u1)表示A为含n个元素的一维数组。1为下标,u1为上标。x为A数组在内存中的起始位置。d为每一个数组元素所占空间大小。那么数组元素与内存地址有下列关系:

Loc(A(i))=a+(i-1)*dLoc(A(i))表示A(i)所在的地址

2.2.2二维数组

二维数组可视为一维数组的扩展。只不过须将二维转换成一维数组。
A[3][3]中各个元素在直观平面上的排列顺序如下图。
这里写图片描述
以上将二维数组以矩阵图表示是为了方便用户看清楚二维数组的内容。但在实际的计算机内存中是无法以矩阵方式存储的。必须以线性方式。视为一维数组的扩展来处理。
通常通过按照不同的语言,又区分为两种形式。现有二维数组A(m,n)
1.以行为主(Row-Major)

Loc(A(i,j))=a+n*(i-1)*d+(j-1)*dLoc(A(i,j))为二维数组的内存地址。a为数组在内存的起始地址。d为单位空间。

2.以列为主(Column-Major)

    Loc(A(i,j))=a+(i-1)*d+m*(j-1)*dLoc(A(i,j))为二维数组的内存地址。a为数组在内存的起始地址。d为单位空间。

例:若A(3,3)在位置121,A(6,4)在位置159,则A(4,5)在位置如何?(单位空间为1)

解答:由Loc(3,3)=121,Loc(6,4)=159,得知数组A的分配是以“以列为主”的方式,所以起始地址为a,单位空间为1.对数组A(m,n)有以下推导a+(3-1)*1+m(3-1)*1=a+2+2m=121     ①a+(6-1)*4+(4-1)*m=a+3m+5=159     ②   由①,②得a=49,m=35Loc(A(4,5))=49+4*35+3=192(#)

A(m,n)可是为A(1:m,1:n)这两种方式称为简单表示法,且m,n的起始值一定是1。 我们这里介绍另一种“标注表示法”声明A(l1:u1,l2:u2)且对任意的A(i,j),有u1>=i>=l1,u2>=j>=l2。那么此数组共有(u1-l1+1)行,(u2-l2+1)列

以行为主:Loc(A(i,j))=a+((i-l1+1)-1)*n*d+((j-l2+1)-1)*d以列为主:Loc(A(i,j))=a+((i-l1+1)-1)*d+((j-l2+1)-1)*m*d

2.2.3三维数组

基本上三维数组的表示法和二维数组一样,皆可视为一维数组的扩展,三维数组若以线性的方式来处理,也可以分为“以行为主”和“以列为主”比如现在这有一个三维数组A(u1,u2,u3)也可表示为A(1:u1,1:u2,1:u3)
1.以行为主(Row-Major)
我们可以将数组视为u1个u2*u3的二维矩阵。再将每个数组视为有u2个一维数组,每个一维数组包含了u3个元素。

    Loc(A(i,j,k))=a+(i-1)*u2u3d+(j-1)u3d+(k-1)d    Loc(A(i,j,k))表示A(i,j,k)所在内存地址。a为数组起始地址,d为单位空间。    若数组A声明为A(l1:u1,l2:u2,l3:u3)模式,则:    令 a=u1-l1+1       b=u2-l2+1       c=u3-l3+1    Loc(A(i,j,k))=a+(i-l1)bcd+(j-l2)cd+(k-l3)d

2.以列为主:
将数组视为u3个u2*u1的二维数组,再将每个数组视为u2个一维数组,每个数组包含有u1个元素。

    Loc(A(i,j,k))=a+(i-1)d+(j-1)u1d+(k-1)u1u2d    Loc(A(i,j,k))表示A(i,j,k)所在内存地址。a为数组起始地址,d为单位空间。    若数组A声明为A(l1:u1,l2:u2,l3:u3)模式,则:    令 a=u1-l1+1       b=u2-l2+1       c=u3-l3+1    Loc(A(i,j,k))=a+(i-l1)d+(j-l2)ad+(k-l3)abd

2.2.4多维数组

这里不多做介绍。也可分为这两种形式。

以行为主:Loc(A(i1,i2,i3,...,in))=a+(i1-1)u2u3...und                         +(i2-1)u3u4...und                         +(i3-1)u4u5...und                         +...                                      +(in-1)d以列为主:Loc(A(i1,i2,i3,...,in))=a+(in-1)u(n-1)u(n-2)...u1d                         +(i(n-1)-1)u(n-2)u(n-3)...u1d                         +(i(n-2)-1)u(n-3)u(n-4)...u1d                         +...                                      +(i1-1)d

2.2.5Arrays类实现

注意其中的binarySearch()只能对已排序过的数组进行搜索,通常搭配sort()方法一起使用。

关于数组的应用我们放到下篇说明。

1 0
原创粉丝点击