1 / 16

第 16 次课 第五章 数组和广义表 教学目的和要求: 1 、了解数组的组织形式。 2 、了解广义表的概念和存储方式。 重点和难点: 1 、数组的组织形式。 2 、广义表的存储方式和基本操作。

第 16 次课 第五章 数组和广义表 教学目的和要求: 1 、了解数组的组织形式。 2 、了解广义表的概念和存储方式。 重点和难点: 1 、数组的组织形式。 2 、广义表的存储方式和基本操作。 授课时间: 6 学时. 5.1 数组的定义(了解即可) 数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯一可供使用的复合数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。多维数组是一维数组的推广。例如,二维数组: a11 a12 … a1 n

reuben-webb
Download Presentation

第 16 次课 第五章 数组和广义表 教学目的和要求: 1 、了解数组的组织形式。 2 、了解广义表的概念和存储方式。 重点和难点: 1 、数组的组织形式。 2 、广义表的存储方式和基本操作。

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第16次课 第五章 数组和广义表 教学目的和要求: 1、了解数组的组织形式。 2、了解广义表的概念和存储方式。 重点和难点: 1、数组的组织形式。 2、广义表的存储方式和基本操作。 授课时间:6学时

  2. 5.1数组的定义(了解即可) 数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯一可供使用的复合数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。多维数组是一维数组的推广。例如,二维数组: a11 a12 … a1 n a21 a22 … a2 n … … … … am 1 am 2 … am n 数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。

  3. 5.2数组的顺序表示 多维数组在逻辑上是多维的,但是内存却是一维的。因此多维数组在内存中要转化为一维存储。 有两种转换方式,一种是行优先方式,如C语言、Pascal语言等。一种是列优先方式,如Fortran语言等。 对于二维数组A:

  4. 其行优先存储 如下:

  5. 列优先存储 如下:

  6. 那么二维数组有下标A[i][j],一维数组有下标k,则k与i,j之间的关系如何呢?同理,三维数组、四维数组、多维数组呢?那么二维数组有下标A[i][j],一维数组有下标k,则k与i,j之间的关系如何呢?同理,三维数组、四维数组、多维数组呢?

  7. 以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。

  8. 数组A[m][n] 待求元素:A[i][j] 每维元素个数: m n * + 待求元素的下标: i j 元素个数满足下面的关系:

  9. 5.3矩阵的压缩存储 5.3.1特殊矩阵 所谓特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,下面我们讨论几种特殊矩阵的压缩存储。 常见的特殊矩阵有:对称矩阵、三角矩阵、对角矩阵等。下面我们以对称矩阵为例来看特殊矩阵的存储方式。

  10. 在一个n阶方阵A中,若元素满足下述性质: aij=aji 1≦i,j≦n 则称A为对称矩阵。 如下图便是一个5阶对称矩阵。

  11. 对称矩阵中的元素关于主对角线对称,故只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间,这样,能节约近一半的存储空间。不失一般性,我们按“行优先顺序”存储主对角线(包括对角线)以下的元素,其存储形式如图所示:

  12. 在这个下三角矩阵中,第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]个元素的个数

  13. 若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

  14. 若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

  15. 因此,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的压缩存储.

  16. 思考题: 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=( )。(写出表达式)

More Related