DS第四章 数组
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习3:
二维数组A的每个元素是由 个字符组成的串 二维数组 的每个元素是由6个字符组成的串, 的每个元素是由 个字符组成的串, 行下标从0~8,列下标从 行下标从 ,列下标从0~9; ; 2). A的第 列和第 行共占多少个字节? 的第8列和第 行共占多少个字节? 的第 列和第5行共占多少个字节 列共9个 行共10个 但是行、 解: 第8列共 个,第5行共 个,但是行、 列共 行共 列处有一个交叉,所以共有18个元素 个元素, 列处字节。 个字节
void find(int B[M][N],int x, int &i,int &j) { //M,N是常量,分别为数组最大行、列数 是常量, 是常量 分别为数组最大行、 i=0,j=N-1,flag=0; //flag是成功找到 的标志 是成功找到x的标志 是成功找到 while (i<=M-1 && j>=0) { if B[i][j]==x ) { flag=1; break; } else if (B[i][j]>x ) j--; else i++; }//while if flag printf(“x在B中的位置是”, i,j); 中的位置是” 在 中的位置是 else printf(“查找失败”); 查找失败” 查找失败 }//find
练习3:
二维数组A的每个元素是由 个字符组成的串 二维数组 的每个元素是由6个字符组成的串, 的每个元素是由 个字符组成的串, 行下标从0~8,列下标从 行下标从 ,列下标从0~9; ; 1). 存放 至少需要多少个字节? 存放A至少需要多少个字节 至少需要多少个字节? 个元素, 解: A共9行10列,所以有 个元素,存放 共 行 列 所以有90个元素 A至少需要 至少需要90*6=540个存储单元(字节) 个存储单元( 至少需要 个存储单元 字节)
1 6 2 7 3 8 4 9 5 10
11 12 13 14 15 16 17 18 19 20
算法分析:
矩阵中元素已经按行和按列排好序, 矩阵中元素已经按行和按列排好序,要求查找的时间复杂度为 O(m+n),因此不能采用常规的二层循环的查找。 ,因此不能采用常规的二层循环的查找。 方法: 的右上角元素开始比较, 种可能的结果: 方法:从B的右上角元素开始比较,每次比较有 种可能的结果: 的右上角元素开始比较 每次比较有3种可能的结果 1) B[i,j]=x ,查找成功; 查找成功; 2) B[i,j]>x,则向 小的方向(即向左)继续查找(减少一列); 小的方向( ,则向j小的方向 即向左)继续查找(减少一列); 3) B[i,j]<x,则向 大的方向(即向下)继续查找(减少一行); 大的方向( ,则向i大的方向 即向下)继续查找(减少一行); 这样:每次比较可以使得搜索范围减少一行或一列, 这样:每次比较可以使得搜索范围减少一行或一列,最多经过 m+n次比较就可以找到。 次比较就可以找到。 次比较就可以找到 若下标超出范围,则查找失败。 若下标超出范围,则查找失败。
4.2
多维数组
考核知识点: 考核知识点: 4. 数组的存储结构与寻址:由于在数组上一 数组的存储结构与寻址:由于在数组上一 般不能做插入、删除的操作,所以数组通常采 般不能做插入、删除的操作, 用顺序存储结构。 通常有两种映像方法: 两种映像方法 通常有两种映像方法: (1). 按行优先:先行后列,先存储行号较小 按行优先:先行后列, 的元素,行号相同者先存储列号较小的元素; 的元素,行号相同者先存储列号较小的元素; (2). 按列优先:先列后行,先存储列号较小 按列优先:先列后行, 的元素,列号相同者先存储行号较小的元素; 的元素,列号相同者先存储行号较小的元素;
考核知识点: 考核知识点: 1. 数组的定义:是由类型相同的数据元素构 数组的定义: 成的有序集合, 成的有序集合,每个数据元素称为一个数组元 简称为元素),每个元素受n(n≥1)个线性 ),每个元素受 素(简称为元素),每个元素受 个线性 关系的约束,每个元素在n个线性关系中的序号 关系的约束,每个元素在 个线性关系中的序号 i1,i2,……in称为该元素的下标,并称该数组为 称为该元素的下标,并称该数组为n 维数组。 维数组。 2. 数组与线性表的关系 数组是线性表的推广
void move(int A[ ],int n) 由于只使用了i, , 由于只使用了 ,j,temp,所 , { int i=0, j=n-1,temp; 以S(n)=O(1) while(i<j) { while(i<j)&&A[i]%2==1) i++; //从左向右找到偶数 从左向右找到偶数A[i] 从左向右找到偶数 while(j>i)&&A[i]%2==0) j--; //从右向左找到奇数 从右向左找到奇数A[j] 从右向左找到奇数 if (i < j ) { temp= A[i]; A[i]= A[j]; A[j]=temp; i++; j--; }//if 尽管使用了3个 尽管使用了 个while,但是只扫描了 数组一 ,但是只扫描了A数组一 }//while 次,即从左向右和从右向左分别扫描,到两者 即从左向右和从右向左分别扫描, 相遇为止。所以T(n)=O(n) 相遇为止。所以 }//move
数组的按行优先存储
设二维数组A是: A[c1..d1,c2..d2](c1≤i≤d1,c2≤j≤d2) 其中c1、c2和d1、d2分别为二维数组A的边界 的下界和上界,每个数组元素占用L个存储单元
LOC(i,j)=LOC(c1,c2)+[(i-c1)*(d2-c2+1)+(j-c2)]*L
设n维数组为: A[c1..d1,c2..d2,…,cn..dn]
算法设计题1的另外一种表述:
数组B[0..m-1,0..n-1]的数据在行、列方向上都 的数据在行、 数组 的数据在行 按从小到大的顺序排列,且整型变量x中的数据在 按从小到大的顺序排列,且整型变量 中的数据在 B中一定存在。试设计算法,找出一对满足 中一定存在。 中一定存在 试设计算法, B[i,j]=x的i,j值。要求比较次数不超过 的 值 要求比较次数不超过m+n。 。 列的矩阵B从 ~ 。查找17。 如4行5列的矩阵 从1~20。查找 。 行 列的矩阵
第四章 数组
4.1 考纲要求及分析
考纲要求: 考纲要求: 特殊矩阵的压缩存储 考纲分析: 考纲分析: 本章不属于重点考核的内容,主要以选择题的形式出现。 本章不属于重点考核的内容,主要以选择题的形式出现。 本章要求: 本章要求: (1). 理解数组的定义和存储方法,注意数组元素具有相同的数 据 理解数组的定义和存储方法, 类型,因此,每个元素占用的存储单元数相同; 类型,因此,每个元素占用的存储单元数相同; (2). 掌握特殊矩阵的压缩存储方法,以及将特殊矩阵压缩存储后 掌握特殊矩阵的压缩存储方法, 矩阵元素的寻找方法; 矩阵元素的寻找方法;
4.2
多维数组
考核知识点: 考核知识点: 3. 数组的基本操作:数组是一个具有固定格 数组的基本操作: 式和数量的数据集合,在数组上一般不能做插 式和数量的数据集合, 删除的操作。 入、删除的操作。 数组中通常只有两种操作: 两种操作 数组中通常只有两种操作: (1). 读取:给定一组下标,读取相应的数组 读取:给定一组下标, 元素; 元素; (2). 修改:给定一组下标,存储或修改相应 修改:给定一组下标, 的数组元素; 的数组元素;
LOC(j1,j2,…,jn)= LOC(c1,c2,…,cn)+[(j1-c1)*(d2-c2+1)*(d3c3+1)*…*(dn-cn+1)+(j2-c2)*(d3-c3+1)*…*(dn-cn+1)+…+(jn-1cn-1)*(dn-cn+1)+(jn-cn)]*L 该式为二维数组中任一元素的存 n n =LOC(c1,c2,…,cn)+ ∑ ( j i − c i ) ∏ ( d k − c k + 1) ] * L 储位置, 储位置,LOC(c ,c )是二维数组的 是二维数组的 起始位置,亦称为基地址。 起始位置,亦称为基地址。
关于矩阵元素的寻址,通常有两种出题方式: 关于矩阵元素的寻址,通常有两种出题方式: 两种出题方式 (1). 给出压缩存储的首地址和每个元素占用的 地址空间,求矩阵中某元素在存储数组中的位置; 地址空间,求矩阵中某元素在存储数组中的位置; (2). 直接求矩阵中某元素在存储数组中的下标
4.2
多维数组
练习2:
C语言中定义的一维数组 语言中定义的一维数组a[50]和二维数组 语言中定义的一维数组 和二维数组 b[10][5]具有相同的首地址,即 具有相同的首地址, 具有相同的首地址 &(a[0])=&(b[0][0]),再以列序为主时, ,再以列序为主时, a[18]的地址和( )的地址相同。 的地址和( 的地址相同。 的地址和 A. b[1][7] B. b[1][8] C. b[8][1] D. b[7][1] 分析: 是数组的第19个元素 分析: a[18]是数组的第 个元素, 是数组的第 个元素, b[8][1]=1*10+9=19, 即b[8][1]是数组 是数组b , 是数组 按列优先存储的第19个元素 个元素。 按列优先存储的第 个元素。 C为答案, 即&(a[18])=&(b[8][1]) 。 为答案, 为答案
算法设计题2
设一系列正整数存放在一维数组中, 设一系列正整数存放在一维数组中,试设计算 将所有奇数存放在数组的前半部分, 法,将所有奇数存放在数组的前半部分,将所 有的偶数放在数组的后半部分。 有的偶数放在数组的后半部分。要求尽可能少 用临时存储单元并使时间最少。 用临时存储单元并使时间最少。分析算法的 T(n)和S(n)。 和 。 可以就地移动。 从左向右扫描数组找到一 可以就地移动。用i从左向右扫描数组找到一 个偶数, 从右向左扫描数组找到一个奇数 从右向左扫描数组找到一个奇数, 个偶数,用j从右向左扫描数组找到一个奇数, 然后将两者交换,如此这样,直到i≥j为止 为止。 然后将两者交换,如此这样,直到 为止。
1 2
i =1
k = i +1
练习1:
数组A[0..5,0..6],每个元素占5个字节,首地 ,每个元素占 个字节 个字节, 数组 址为1000,按列优先存储,则A[5,5]的存储地 址为 ,按列优先存储, 的存储地 址是 ( )。 分析: 因为是按列优先,所以在A[5,5] 前已经 分析: 因为是按列优先,所以在 存储了0~ 列共 列共5列 每列有6个元素 个元素, 存储了 ~4列共 列,每列有 个元素,所以共 5×6=30个元素。在第 列上, A[5,5]之前有 个元素。 列上, × = 个元素 在第5列上 之前有 5个元素,则A[5,5]之前共有 个元素, 之前共有30+5=35个元素, 个元素, 个元素 之前共有 个元素 所以其地址为: 所以其地址为: 1000+35*5=1175
算法中查找x的路线从右上角开始, 算法中查找 的路线从右上角开始, 的路线从右上角开始 向下(当 或向左(当 向下 当x> B[i][j])或向左 当x< 或向左 B[i][j])。向下最多执行M次 B[i][j])。向下最多执行M次,向 左最多执行N次 左最多执行 次。最好情况是在右 上角比较一次, 上角比较一次,最差情况是在左下 角比较M+N-1次。 角比较 次
数组部分 算法设计题 多维数组的算法设计以二维 数组为重点。 数组为重点。从考核目标的 角度来说, 角度来说,数组的算法设计 主要考查的是程序设计基础, 主要考查的是程序设计基础, 因此, 因此,在DS中不是考试的重 中不是考试的重 点。
算法设计题1
给定n×m矩阵B[a..b,c..d],满足 B[i,j] ≤ B[i,j+1] (a ≤i ≤b, c ≤j ≤d-1)和 B[i,j] ≤ B[i+1,j] (a ≤i ≤b-1, c ≤j ≤d)。 试设计算法评定 x 是否在B中,要求时间复杂 度为O(m+n)