数组专项训练

1. 稀疏矩阵可以采用三元组顺序表方法压缩存储

  稀疏矩阵:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵

  三元组:即由三部分元素组成的集合,组中数据((x,y),z)分别表示为((行标,列标),元素值),主要是用来存储稀疏矩阵的一种压缩方式,也叫三元组表。假设以顺序存储结构来表示三元组表(triple table),则得到稀疏矩阵的一种压缩存储方式,即三元组顺序表,简称三元组表。

稀疏矩阵的压缩存储有三种具体的实现方法:

1.三元组顺序表

2.行逻辑链接的顺序表

3.十字链表

2. 一个顺序表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是108 

第一个元素的存储地址是100,第二个是102,第三个是104,第四个是106,第五个是108

3. 线性表是一个有限序列,可以为空

线性表是由同种数据类型的数据元素组成的有序序列,事实上,在计算机性中处理的对象都是有限的,无限数列只存在于数学概念中。线性表是有限序列,元素也有限。

4. 线性表的顺序存储结构是一种(  随机存取  )的存储结构。

每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。由此,只要确定了存储线性表的起始位置,线性表中任一元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。

随机存取和顺序存取概念辨析:

1、随机存取:就是直接存取,可以通过下标直接访问的那种数据结构,与存储位置无关,例如数组。存取第N个数据时,不需要访问前(N-1)个数据,直接对第N个数据操作(array)。

2、顺序存取:即非随机存取。存取第N个数据时,必须先访问前(N-1)个数据 (list),不能通过下标访问,只能按照存储顺序存取,与存储位置有关,例如链表

5. 二维数组k[1..7,1..9],每元素大小占2个字节,而且使用列存储,a[5,4]的偏移量为(50)个字节。 

该题是按列存储,列优先

由题可知k[1...7,1...9](下标由1开始),代表一个7*9的矩阵

a[5,4]代表第五行第四列

由于列优先,(3*7+4)*2=50

6. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 (n-i+1) 个元素。 

在第i个元素之前插入,前i-1个元素不动,则需要向后移动n-(i-1)->n-i+1

7. 对于不同的特殊矩阵应该采用不同的存储方式

 特殊矩阵中元素有规律,采用数组存储。而像稀疏矩阵中元素没有规律,所以一般采用三元组或者伪地址表示法

8. 掌握基本排序(直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、桶排序),了解各个排序的实现过程以及算法

9. 从一个无序数组中挑选出其中前十个最大的元素,在以下的排序方法中最快的方法是堆排序

A.快速排序

B.堆排序

C.归并排序

D.基数排序

堆排序不需要等整个排序结束就可挑出前10个最大元素,而快速排序和基数排序都需等待整个排序结束才能知道前10个最大元素

基本排序

10. 设有一个 10 阶的下三角矩阵 A (包括对角线),按照行优先的顺序存储到连续的 55 个存储单元中,每个数组元素占 1 个字节的存储空间,则 A[5][4] 地址与 A[0][0] 的地址之差为( 19 ) 

由题可知这是一个10阶的下三角矩阵,按行存储,A[5][4]表示第六行第五列,它到A[0][0]的地址之差为(((1+5)*5/2)+4)*1=19

11. c++当中,对以下二维数组的正确声明是(  C

A. int a[3][];

B.float a(3,4);

C.double a[][4];

D.float a(3)(4);

 数组声明的时候可以行列一起声明大小,也可以只声明列,但是不能只声明行

12.  以下哪个选项正确定义了一维数组。(A)

A.char a[] = {'0', '1', '2', '3', '\0'};

B.char a = {'A', 'B', 'C'};

C.int a[] = "0123";

D.int a[3] = {0, 1, 2, 3};

B选项中a并没有定义成数组,而是字符,会出错;

C选项整型数组不能被赋值字符串;

D选项定义的初值个数超过了数组的长度;

13. 线性表的长度是线性表所占用的存储空间的大小  ×

线性表的数据类型决定了线性表的存储,长度与数据类型共同决定存储大小

14. 数组可看作基本线性表的一种推广,因此与线性表一样,可以对它进行插入、删除等操作  ×

数组一旦定义,空间就固定,无法插入,否则会导致越界

15. 数组常用的两种基本操作是(  C  )

A.建立与删除

B.删除与查找

C.查找与修改

D.插入与索引

数组不适用于插入和删除

数组:查找与修改时的时间复杂度远小于链表。

链表:插入和删除比数组更方便

16. 数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(D

A.r-f

B.(n+f-r)% n

C.n+r-f

D.(n+r-f)% n

关于循环队列的一些计算问题:

front为队头、rear为队尾、maxSize为队列的总容量、m为队列中元素的个数

队空:front = rear

队满:(rear + 1) % maxSize = front

进队:front = (front + 1) % maxSize

出队:rear = (rear + 1) % maxSize

队列中元素的个数 m = (rear - front + maxSize) % maxSize

17.  定义语句"double * array [8]"的含义是array是一个数组,数组的每一个元素是指向双精度实型数据的指针

18. 在面向对象的程序设计中,关于数组,下列说法正确的有(B

A.数组属于一种原生类

B.数组是一种对象

C.int number=[]={31,23,33,43,35,63}

D.数组的大小可以任意改变

A.原生类指的是原生数据,又叫做基本数据类型,主要有byte,short,int,long,float,double,char,boolean;原生类指未被实例化的类,数组一般指实例化,被分配空间的类,不属于原生类

B.对象的特点是封装了一些数据,同时提供了一些属性和方法,从这个角度来讲,数组是对象

C.格式有误

D.数组的大小确定之后不可改变

19. 设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为(r-f+n) mod n

20. 已知数组char a[100],以下哪个选项可以访问数组的倒数第n(1≤n≤100)个元素。 (B)

A.a[99-n]

B.a[100-n]

C.a[101-n]

D.*(a+101-n)

数组元素的索引值从0开始,所以正数第n个元素的索引值是(n-1)。

元素总数为100的数组倒数第n个元素的索引值是(100-n)。

20. 线性结构的是串、链式存储栈、顺序存储栈 

21.

(1)线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。

(2)二维数组是每个元素都为线性表的线性表

22. 设有下面的程序段:

1

 char s[ ]=”china”; char *p; p=s; 

则下列叙述中正确的是(D )。

A.s 和 p 完全相同

B.数组 s 中的内容和指针变量 p 中的内容相等

C.s 数组长度和 p 所指向的字符串长度相等

D.*p 和 s[0]值相等

根据题目:p=s;将指针P指向数组S的内存首地址

  • p申请的内存空间存放的是s首地址的内存空间,而s的连续内存空间存放的china,所以A错误
  • 数组s的内容是china,而指针p内容为s的地址,所以B错误
  • s数组的长度为6(包含结束符'\0'),p所指向的字符串长度为5。所以C错误

23. 数组元素的下标值越大,存取时间越长,这样的说法正确吗?   ×  

数组下标越大遍历数组时间越长,但是存取都是对单个位置做操作的,下标多大在内存里都是个地址,即拿着地址找数据速度都一样

24. 以下程序段的运行结果是( "output"  )。

1

2

char str[10] = "output";

printf("\"%s\"\n", str);

 \" 这里的\为转义字符,表示显示双引号,第一个和第二个一样

25. 下列关于数组与指针的区别描述正确的是?B

A.数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

B.用运算符sizeof 可以计算出数组的容量(字节数)

C.指针可以随时指向任意类型的内存块。

D.用运算符sizeof 可以计算出指针所指向内容的容量(字节数)

A.数组要么在静态存储区被创建(如全局数组),要么在栈或堆上被创建。

C.若为指针常量,则不可,const指针

D.sizeof(指针),应为计算指针的大小,32位平台下为4个字节

26. 数组指针和指针数组有什么区别 ?

数组指针只是一个指针变量,它占有内存中一个指针的存储空间

指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间

27. 线性表L=(a 1 ,a 2 , … ,a n ),除第一个和最后一个元素外,其余每个元素都有且仅有一个直接前驱和直接后继

28. 给出一个由 n 个数组成的序列 A[1…n] ,要求找出它的最长单调上升子序列,设 m[i] ( 1 ≤ i ≤ n ),表示以 A[i] 结尾的最长单调上升子序列的长度,则 m[1] = 1 , m[i] ( 1 < i ≤ n )为( m[i] = 1 + max{0,m[k](A[k] < A[i],1≤k < i )}

29. 下列哪些不是线性表? C

A.队列

B.栈

C.关联数组

D.链表

1. 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表;    2. 栈(stack)在计算机科学中是限定仅在栈顶进行插入或删除操作的线性表。

3. “关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。

    关联数组和数组类似,由以名称作为键的字段和方法组成。 它包含标量数据,可用索引值来单独选择这些数据,和数组不同的是, 关联数组的索引值不是非负的整数而是任意的标量。这些标量称为Keys,可以在以后用于检索数组中的数值。

    关联数组的元素没有特定的顺序,你可以把它们想象为一组卡片。每张卡片上半部分是索引而下半部分是数值。

4. 链表(Linked list)是一种常见的基础数据结构,是一种线性表,是一种物理存储单元上非连续、非顺序的存储结构。

30. 若定义:char s[20]="programming",*ps=s ;

则不能表示字符‘o’的是(A

A.ps+2

B.s[2]

C.ps[2]

D.*(ps+2)

A项,ps为指针,ps+2为一个地址,因此不能表示字符‘o’。

B项和C项,当ps为指针时,ps[2]等价于s[2],表示的都是数组中的第3个元素。前者表示指针名称加下标引用元素,而后者表示数组名称加下标来引用元素。因此B和C正确。

D项,*(ps+2),取到了ps[2]的值,因此为‘o’。因此D正确

31. 合法的数组说明语句是(  D

A.int a[] = "string";

B.int a[5] = {0.1, 2, 3, 4};

C.char a = "string ";

D.char a[] = {0, 1, 2, 3, 4, 5};

char类型和int类型是能隐式转换的,0,1,2,3,4,5都分别对应一个char类型的符号,所以D是正确的

32. 在C语言中,若有定义:int a[4][10](其中0<=i<4,0<=j<10);则下列选项中对数组元素a[i][j]引用错误的是(A

A.*(a+i)+j

B.*(&a[0][0]+10*i+j)

C.*(a[i]+j)

D.*(*(a+i)+j)

二维数组两个[ ]或者两个*都表示元素 对[ ][ ] 取地址表示地址 一个*表示地址 一个[ ]表示地址 加常数表示偏移


a+i是指针,指向a[i](即a[4]中的第i个元素,也就是一个长度为10的数组),*(a+i)就是数组,编译器在处理时,将*(a+i)自动转换为指向该数组首元素的指针,+j后该指针指向a[i][j],再次取值即得到了a[i][j]

A是a[i][j]的地址

D是A再取*则是a[i][j]的值

C正确,a[i]为第i行第0个元素的值,加j后为a[i][j]地址,再取*就是a[i][j]

B正确,a[0][0]取地址是数组第一个元素的地址,加上10*i为第i行第0个元素的地址,在加j是a[i][j]地址,再取*是a[i][j]的值

33. 若数组S[1..n]作为两个栈S1和S2的存储空间,对任何一个栈,只有当[1..n]全满时才不能进行进栈操作。为这两个栈分配空间的最佳方案是(S1的栈底位置为1,S2的栈底位置为n

两头并进,从数组头部和数组尾部,相向添加元素,当其中一个的下一个所要添的位置不为空的时候,就表示数组已满。

一个在数组第一个元素,朝着数组索引增加方向增加

一个栈顶在数据最后一个元素,朝着数组索引减少方向增加

当两个栈的栈顶位置相差1时,数组被写满

34. 下列叙述中正确的是( B) 

A.有一个以上根结点的数据结构不一定是非线性结构

B.只有一个根结点的数据结构不一定是线性结构

C.循环链表是非线性结构

D.双向链表是非线性结构

线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以 B 正确。树,就只有一个根节点,但是不是线性结构.

所以有一个以上根结点的数据结构一定是非线性结构,所以 A 错误。

循环链表和双向链表都是线性结构的数据结构

35. 若用一个大小为 6 的数组来实现循环队列,且当 rear 和 front 的值分别为 0 和 3 。当从队列中删除一个元素,再加入两个元素后,rear 和 front 的值分别为  2和4 

1、队列添加元素是在对尾,删除元素是在对头;

2、添加元素,尾指针rear+1;删除元素,头指针front+1;

 

3、本题中,删除一个元素,front+1,也就是3+1=4;添加2个元素,rear+2,也就是0+2=2

36. 在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行几次比较(  9次   

首先比较得到最大数值:

step1:8个数字,分为4组比较,分别得到4个较大数值,比较4次

step2:4个数字,分为2组比较,分别得到2个较大数值,比较2次

step3:2个数字,互相比较,得到最大数值,比较1次

然后用step1比较结果的剩下的3个数字互相比较,例如剩下三个数字为a、b、c,a与b比较得到较大数字再与c比较,比较2次,得到第二大数值

综上,共比较4+2+1+2=9次

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 训练数组和验证数组的大小区别是,训练数组用于训练模型,验证数组用于验证模型的准确性和泛化能力。通常情况下,训练数组的大小要比验证数组的大小大,以确保模型能够充分学习数据的特征,同时也要避免过拟合的问题。 ### 回答2: 训练数组和验证数组在机器学习中的使用有一些区别。训练数组通常是用来训练模型的,也被称为训练集。它包含了模型用来学习的样本数据。训练数组的大小对于训练模型的过程很重要。通常情况下,训练数组越大,模型能够学到的特征和模式就越多,因此模型在真实数据上的表现可能会更好。 验证数组用于验证训练好的模型在训练集之外的数据上的表现,也被称为验证集。验证数组的大小也很重要,因为它会影响对模型泛化能力的评估。如果验证数组的大小过小,模型可能会过拟合,也就是说只在训练数据上表现较好,但在其他数据上表现糟糕。反之,如果验证数组的大小过大,验证的结果可能会不准确,因为验证数组的数据可能无法充分代表真实情况。 因此,我们通常会将原始数据集划分为训练数组和验证数组,比如常见的划分比例是70%训练数组和30%验证数组。这样可以通过在训练集上训练模型,然后在验证集上验证模型的表现来选择最佳的模型参数,以获得最好的泛化能力。通常情况下,我们还会进行交叉验证来更准确地评估模型的性能。 总结起来,训练数组用于训练模型,大小越大越好;验证数组用于验证模型在真实数据上的表现,大小需要适度,不能太小也不能太大。这两者的大小选择很关键,可以通过合适的划分和交叉验证来提升模型的性能。 ### 回答3: 训练数组和验证数组是在机器学习中常用的两种数据集。 训练数组是用于模型的训练过程的数据集。通常情况下,我们会将整个数据集分割成训练数组和验证数组训练数组是用来训练机器学习模型的数据集,通过模型和训练数组的输入输出数据进行参数的学习和优化,以达到模型的最优表现。训练数组通常包含大部分的数据样本,以便模型能够从这些数据中学习到普遍规律和特征,提高模型的泛化能力。 验证数组则是用来评估训练得到的模型性能的数据集。一般情况下,我们在训练过程中并不会使用验证数组中的样本进行参数的优化,而是使用它们来验证模型在未见过的数据上的性能和泛化能力。通过在验证数组上的性能评估,我们可以及时发现模型的过拟合或欠拟合问题,进而合理地调整模型的超参数,以达到更好的性能表现。 因此,训练数组和验证数组的大小区别在于,训练数组的大小通常较大,以便模型可以从中学习到数据的特征和规律,而验证数组的大小较小,主要用于评估模型的性能和泛化能力。在实际应用中,还可以采用交叉验证等技术来进一步评估模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值