数据结构与算法多维数组与广义表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对于列号相同者,先存储行号较小者。设二维数组的行下 标与列下标变化范围分别为闭区间[l1, h1]与[l2, h2],按列存 储,每个元素占c个存储单元,则它的任一元素ai, j的相对地 址计算公式为Loc(ai, j)=((j–l2)(h1l1+1)+(il1))×c。对二维数 组,还可有其他的二维向一维的映射方法,如按正对角线、 反对角线等,这里不作讨论。
数组
• 3. 多维数组 • 下面将二维数组推广到多维数组,对n维数组也采用两种存
储映射方式,即二维数组的按行存储与按列存储的推广。 按行存储和按列存储都是一种“左”下标优先的存储方法, 即第1个(最左)下标的下标值较小的元素较先存储,对于 第1个下标值相同者,按第2个下标优先存储,对任意的k> 1,对第1~(k–1)维相同者,先存储第k维中下标值较小者。
数组
• 数组的存储结构与寻址问题 • 数组是一种特殊的数据结构,一般要求元素的存储地址能
根据它的下标(即逻辑关系)计算出来,因此数组一般只 采用顺序存储结构。讨论数组元素地址时,一般将第1个元 素的起始存储单元作为参考单元,参考单元的绝对地址称 为该数组的首地址,数组其他元素的相对地址均相对于首 元素的起始地址。设i1, i2,…, in为某n维数组中的一个元素的 下标,则用Loc( ai1,i2,L ,in )表示此元素的相对地址。 • 对一维数组,与线性表类似,可使用顺序存储方式;但对 多维数组,由于其已不属于线性结构的范畴,因此不能直 接使用顺序存储方式。但多维数组有其特殊性,具有线性 结构的痕迹,它可唯一地转换为一维结构,并可根据元素 的存储位置推算出元素的逻辑关系(下标),所以可将多 维数组映射为一维结构,然后使用顺序存储方式。
数组
• 1. 一维数组 • 一维数组的每个元素只含一个下标,其实质上是一个线性
表,存储方法与普通线性表的顺序存储方法完全相同,即 将数组元素按它们的逻辑次序存储在一片连续区域内。设 一维数组为A =(a0, a1,…, an–1),则它的元素ai的相对地址为 Loc(ai) = i×c。这里,c表示每个元素占用的存储单元数目。
数据结构与算法 (C++语言版)
第5章 多维数组与广义表
数组
• 数组的定义 • 与线性表一样,数组中所有的数据元素都必须属于同一数
据类型,其特点是,每个数据元素可以又是一个线性表结 构。若线性表中的数据元素为简单元素,则称为一维数组, 即向量;若一维数组中的数据元素又是一维数组,则称为 二维数组;依次类推,若二维数组中的元素又是一个一维 数组结构,则称为三维数组。因此,线性表结构可看成是 数组结构的一个特例,而数组结构则是线性表结构的扩展。
数组
• (1)按行存储 • 按行存储的基本思想是先行后列,即先存储行号较小的元
素,对于行号相同者,先存储列号较小者。设二维数组的 行下标与列下标变化范围分别为闭区间[l1, h1]与[l2, h2],按 行存储,则它的任一元素ai, j的相对地址计算公式为Loc(ai, j) = ((h2–l2+1)(i–l1)+(j–l2))×c,这里c为每个元素所占单元数目, i∈[l1, h1],j∈[l2, h2]且i与j为整数。
例5-1
• 设某二维数组的两个下标的范围分别为[–1, 2]与[0, 1],则它 的元素按行存储的次序为(用ai, j表示元素,每个元素占两 个单元):
• 它的元素a1, 1的相对地址计算如下: • Loc(a1, 1)=((10+1)( 1+1)+(10))×2=2。
数组
• (2)按列存储 • 按列存储的基本思想是先列后行,即先存储列号较小者,
• 2ቤተ መጻሕፍቲ ባይዱ 二维数组 • 二维数组的每个元素含有两个下标,不是一般的线性表。
如果将二维数组的第1个下标理解为行号,第2个下标理解 为列号,然后按行列次序排列各元素,则二维数组呈阵列 形状。对于这种非线性结构的存储,需将多维关系映射为 一维(线性)关系,即要确定多维到一维的映射。
数组
• 以之前所示的二维数组为例,它有两种存储方式:以列序 为主序的存储方式(a)和以行序为主序的存储方式就 (b)。
数组
• 例如,在(a)所示的m行n列二维数组中,每个数据元素ai,j 都受两个关系——行关系和列关系的约束。在行关系中, ai,j+1是ai,j的直接后继元素。在列关系中,ai+1,j是ai,j的直接后 继元素,该数组元素的个数为m×n。该数组可被看成是一 个线性表A=(a0, a1, …, ap),p = m–1或n–1,其中每个元素aj 可以是如(b)所示的列向量形式线性表aj=(a0,j, a1,j, …, am– 1,j),0≤j≤n–1,也可以是如(c)所示的行向量形式线性表 ai=(ai,0, ai,1,…, ai,n–1),0≤i≤m–1。
数组
• 同理,n维数组中每个数据元素都受n个关系的约束,都对 应于一组下标(j1, j2, …, jn),元素 (1≤ji≤bi–1,i = 1, 2, …, n) 有一个直接后继元素。因此,就单个关系而言,仍是线性 关系。类似于线性表,数组的抽象数据类型定义参见以下 ADT。
数组
数组
• C++的数组 • 尽管在C++中数组是一个标准的数据结构,但C++数组的索
引(也称为下标)必须采用[i1][i2][i3]…[ik]的形式,其中,ik 为非负整数。如果k为1,则数组为一维数组;如果k为2, 则数组为二维数组。i1是索引的第一个坐标,i2是第二个坐 标,ik是第k个坐标。在C++中,值为整数类型的k维数组 score可用int score[u1][u2][u3]…[uk]语句来创建,其中,ui是 正的常量或由常量表示的正的表达式。对于这样一个数组 描述,索引ij的取值范围为:0≤ ij<uj,1≤j≤k。因此,该数 组最多可容纳n = u1u2u3…uk个值。由于数组score中的每个 值都是整数,所以需要占用sizeof(int)个字节,因此,整个 数组所需要的内存空间为sizeof(score) =n×sizeof(int)个字节。 C++编译器将为数组预留这么多空间。如果预留空间的起始 地址为start,则该空间将延伸至start+size(score)–1。
相关文档
最新文档