160 likes | 288 Views
第 16 次课 第五章 数组和广义表 教学目的和要求: 1 、了解数组的组织形式。 2 、了解广义表的概念和存储方式。 重点和难点: 1 、数组的组织形式。 2 、广义表的存储方式和基本操作。 授课时间: 6 学时. 5.1 数组的定义(了解即可) 数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯一可供使用的复合数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。多维数组是一维数组的推广。例如,二维数组: a11 a12 … a1 n
E N D
第16次课 第五章 数组和广义表 教学目的和要求: 1、了解数组的组织形式。 2、了解广义表的概念和存储方式。 重点和难点: 1、数组的组织形式。 2、广义表的存储方式和基本操作。 授课时间:6学时
5.1数组的定义(了解即可) 数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯一可供使用的复合数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。多维数组是一维数组的推广。例如,二维数组: a11 a12 … a1 n a21 a22 … a2 n … … … … am 1 am 2 … am n 数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。
5.2数组的顺序表示 多维数组在逻辑上是多维的,但是内存却是一维的。因此多维数组在内存中要转化为一维存储。 有两种转换方式,一种是行优先方式,如C语言、Pascal语言等。一种是列优先方式,如Fortran语言等。 对于二维数组A:
那么二维数组有下标A[i][j],一维数组有下标k,则k与i,j之间的关系如何呢?同理,三维数组、四维数组、多维数组呢?那么二维数组有下标A[i][j],一维数组有下标k,则k与i,j之间的关系如何呢?同理,三维数组、四维数组、多维数组呢?
以C语言为例:有二维数组A[m][n],其在内存中的存储位置就是A,每个数组元素占用空间L字节,那么数组元素A[i][j]在内存中的存储位置Loc(A[i][j])=?以C语言为例:有二维数组A[m][n],其在内存中的存储位置就是A,每个数组元素占用空间L字节,那么数组元素A[i][j]在内存中的存储位置Loc(A[i][j])=? Loc(A[0][0])=A; A[0][1]前面只有一个元素A[0][0],所以: Loc(A[0][1])=Loc(A[0][0])+1*L 所以求Loc(A[i][j]),必须求出A[i][j]前面有几个元素。 第0行:有元素n个 第1行:有元素n个 … 第i-1行:有元素n个 第i行:A[i][j]前面共有A[i][0]---A[i][j-1] j个元素; 所以:Loc(A[i][j])=A+(n*i+j)*L。
数组A[m][n] 待求元素:A[i][j] 每维元素个数: m n * + 待求元素的下标: i j 元素个数满足下面的关系:
5.3矩阵的压缩存储 5.3.1特殊矩阵 所谓特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,下面我们讨论几种特殊矩阵的压缩存储。 常见的特殊矩阵有:对称矩阵、三角矩阵、对角矩阵等。下面我们以对称矩阵为例来看特殊矩阵的存储方式。
在一个n阶方阵A中,若元素满足下述性质: aij=aji 1≦i,j≦n 则称A为对称矩阵。 如下图便是一个5阶对称矩阵。
在这个下三角矩阵中,第i行恰有i个元素,元素总数为:n(n+1)/2在这个下三角矩阵中,第i行恰有i个元素,元素总数为:n(n+1)/2 因此,我们可以按行优先次序将这些元素存放在一个向量sa[0..n(n+1)/2-1]中。为了便于访问对称矩阵A中的元素,我们必须在aij和sa[k]之间找一个对应关系。 K恰好就是sa[0]----sa[k-1]个元素的个数
若i≧j,则aij在下三角形中。 aij之前的i行(从第1行到第i-1行)一共有: 1+2+…+i-1=i*(i-1)/2个元素, 在第i行上, aij之前恰有j-1个元素(即ai1,ai2,…,ai,j-1), 因此ai,j前就有: k=i*(i-1)/2+j -1 个元素 0≦k<n(n+1)/2
若i<j,则aij是在上三角矩阵中。因为aij=aji,所以只要交换上述对应关系式中的i和j即可得到:若i<j,则aij是在上三角矩阵中。因为aij=aji,所以只要交换上述对应关系式中的i和j即可得到: k=j*(j-1)/2+i-1 0≦ k<n(n+1)/2 令 I=max(i,j), J=min(i,j),则k和 i, j的对应关系可统一为: k=I*(I-1)/2+J -1 0≦ k<n(n+1)/2
因此,aij的地址可用下列式计算: LOC(aij)=LOC(sa[k]) =LOC(sa[0])+k*d=LOC(sa[0])+[I*(I-1)/2+J-1]*d 有了上述的下标交换关系,对于任意给定一组下标(i,j),均可在sa[k]中找到矩阵元素aij,反之,对所有的k=0,1,2,…n(n+1)/2-1,都能确定sa[k]中的元素在矩阵中的位置(i,j)。由此,称sa[n(n+1)/2]为n阶对称矩阵A的压缩存储.
思考题: 1、给出数组int A [5][4];当它在内存中按行存放和按列存放时,分别写出数组元素A[i][j]的地址计算公式(设每个元素占两个存储单元)。 已知n阶下三角矩阵A(即当i<j时,有aij≠0),按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。请写出从第一列开始采用列序为主序分配方式时在B中确定元素aij的存放位置的公式。 A是一个三对角矩阵、行数与列数相等,用压缩存储的方法将其压缩存储列一堆的数组SA[1….3n-2]中(按行顺序存储),则SA[K]对应的矩阵元素的下标为:行值I=( ),列值J=( ),反过来,若知道A中元素的下标I,J,则其存储住值置K=( )。(写出表达式)