1.经典举例
以放书为例,如果你的房间很乱,床上床下有书,桌子上有书,地上也有书,当你去寻找一本书的时候,你找起来非常麻烦;
于是,你在房间里安装了一个书架,把他们都放在书架上,依次编号。查找的时候,根据书的编号就能很快找到。即使找不到,也可以根据顺序依次查找,总比满屋子乱翻效率高很多。
当你买来一本新书的时候,你直接把新书放在最后一个位置就行了;
书架类似数组,数组是计算机内存里一片连续的存储空间,用来有序存放元素。
根据上面例子,
数组有两个巨大优势。一:根据编号就可以直接查找到元素;二:添加元素只需放在最后一个位置;
但是数组也有缺点:
一,书架上的书有满的时候,此时,我们想存放书就必须再安装一个书架,数组一一样,满的时候也必需再创建一个数组;
二,同顺序存储的插入删除相同,数组的插入删除会比较麻烦;
2.数组介绍
(1)数据结构讲到的数组不同于高级语言中提到的数组,高级语言中的数组是顺序存储,而这里讲到的数组是循序存储和链式存储;
(2)数组元素有固定的上界和下界,
(3)数组的基本操作是初始化,销毁,以及获取特定元素和修改元素;
3.数组分类
一维数组:即为一个线性表;
二维数组:”其数据元素为一维数组“的线性表;
下图分别是 以列序为主序存储,以行序为主序存储;
4.地址计算:
(1)一维数组
一维数组的实质是线性表;存储方式与线性表相同;A=a1,a2,a3,........,an;
Loc( A(i) )=Loc( A [1] ) + (i-1) * k ; k为每个数据元素占用的存储长度;
(2) 二维数组
以名称为A mn 的二维数组为例
以行序为主序的存储方式:
Loc( a ij ) = Loc( a(00) ) + ( i*n + j ) * k ; // Loc( a ij ) = Loc( a(11) ) + ( (i-1)*n +( j-1) ) * k;
Loc(a(00))为二维数组的起始存储地址;k为每个数据元素占用的存储长度;
以列序为主序的存储方式:
Loc( a ij ) = Loc( a(00) ) + ( j*m + i ) * k ; //Loc( a ij ) = Loc( a(11) ) + ( (j-1)*m +( i-1) ) * k
Loc(a(00))为二维数组的起始存储地址;k为每个数据元素占用的存储长度;
(3)多维数组
如三维数组A r*m*n
Loc( a (i j k) )=Loc( A [1] [1] [1] ) +[ (i-1) * m * n + ( j - 1 ) *n + (k-1) ] * size ;
再比如 五维数组 ,A [10] [20] [30] [40] [50],每个数据元素所占的存储长度为 4,基地址为1024
求:a[1][2][3][4][5]的地址;
1024 + [ 1*20*30*40*50 + 2*30*40*50 + 3*40*50 + 4*50 + 5 ] *4 = 1327229;