有一个用数组C[1..m]表示的环形队列,m为数组的长度。假设f为队头元素在数组中的位置,r为队尾元素的后一位置(按顺时针方向)。若队列非空,则计算队列中元素个数的公式应为?

[v_act](m+r-f)mod m
r-f
(m-r+f) mod m
(m-r-f) mod m
(r-f) mod m

需要判断边界 [/v_act]

分情况讨论:

1. 若f < r < = m 则有r-f < nm,即队尾没有超出边界,则为r-f

2. 若r < f < = m, r-f < 0,即队尾超出边界m,那么应为m+r -f

综合两种情况,得到答案 (m+r-f) mod m

在C语言中,设有数组定义:char arrays[]=”China”;则数组array所占用的空间为()。

[v_act]4个字节

5个字节

6个字节

7个字节 [/v_act]

C语言中的字符串用指向该串首个字符的指针表示。不保存长度信息,用’\0’来标识字符串的终止。

因此相当于 char arrays[] = {‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’};

请问对一个排好序的数组进行查找,时间复杂度为()

[v_act]O(n)
O(lgn)
O(nlgn)
O(1) [/v_act]
logN

二分查找

int a[][3]={{1},{3,2},{6,7,8},{9}};中a[2][1]的值是()
[v_act]3
6
2
7[/v_act]

二维数组为4*3,可表示为

1 0 0
3 2 0
6 7 8
9 0 0

因为数组的起始位置为a[0][0],所以a[2][1]为第三行第二列,即7.

所以答案选D

设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11 为第一元素,其存储地址为1,每个元素占一个地址空间,则a85 的地址为()

[v_act]13
33
18
40 [/v_act]

数组下标从1开始,只存储其下三角形元素,在a8,5的前面有7行,第1行有1个元素,第2行有2个元素,…,第7行有7个元素,这7行共有(1+7)×7/2=2 8个元素,在第8行中,a8,5的前面有4个元素,所以,a8,5前有28+4=32个元素,其地址为33。

设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为()

[v_act]BA+141
BA+180
BA+222
BA+225 [/v_act]

本题A[5,8]以列为主,该元素处于第八列,前七列是满的每列8个元素,该元素处于第五行,他的前一个元素A[4,8]的结束地址就是所求的开始,最后,每个元素占3。所以有公式:(7*8+4)*3

数组通常具有的两种基本操作是()

[v_act]查找和修改

查找和索引

索引和修改

建立和删除 [/v_act]

数组通常具有的两种基本操作是查找和修改

数组A[0..5,0..6]的每个元素占5个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是()

[v_act]1175
1180
1205
1210 [/v_act]

先计算出A[5][5]是5*6+6=36,即A[5][5]是第36个数,从A[0][0]到A[5][5]是等差数列,共36个数,所以d36=d1+(36-1)*5=d1+36*5-5=1175

若6行5列的数组以列序为主序顺序存储,基地址为1000,每个元素占2个存储单元,则第3行第4列的元素(假定无第0行第0列)的地址是()

[v_act]1040
1042
1026

备选答案A,B,C都不对 [/v_act]

思路:按列存储,第一列的基址是:1000,第二列的基址是:1012,第3列是:1024,第4列是:1036,所以第三行第4列为:1036+2+2=1040

将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1..298]中,A中元素A6665 (即该元素下标i=66,j=65),在B数组中的位置K为()供选择的答案:

[v_act]198
195
197 [/v_act]

先假设每行都有三个,66行就198个,减去第一行一个剩下197个,然后算最后一行,第65列所处的位置是三个数的第一个,所以还要再减去2。即66*3-(3-(65-1)%3)-1=195

稀疏矩阵一般的压缩存储方法有两种,即()

[v_act]二维数组和三维数组

三元组和散列

三元组和十字链表

散列和十字链表 [/v_act]

1.三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。当矩阵中的非0元素少于1/3时即可节省存储空间。

2.十字链表:是既带行指针又带列指针的链接存储方式,每个三元组结点处于所在行单链表与列单链表的交点处,当矩阵的非零元个数和位置在操作过程中变化较大时,用这种存储结构更为恰当。

在十字链表中,每个非零元可用一个含五个域的结点表示,其中 i, j 和e 三个域分别表示该非零元所在的行、列和非零元的值,向右域 right 用以链接同一行中下一个非零元,向下域down 用以链接同一列中下一个非零元。同一行的非零元通过 right 域链接成一个线性链表,同一列的非零元通过 down 域链接成一个线性链表,每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,故称这样的存储结构为十字链表,可用两个分别存储行链表的头指针和列链表的头指针的一维数组表示之。

若对n阶对称矩阵A(下标从1,1开始)以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1…(n(n+1))/2]中,则在B中确定aij (i < j)的位置k的关系为()

[v_act]i*(i-1)/2+j
j*(j-1)/2+i
i*(i+1)/2+j
j*(j+1)/2+i [/v_act]

矩阵下标从1,1开始;一维数组下标从1开始;

故对应关系为:

当i > = j时,k=i(i-1)/2+j;

当i < = j时,k=j(j-1)/2+i;

题干中有个条件(i < j),算是一个坑,所以选B不选A

设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij (1 < =i,j < =n,且i < =j)在B中的位置为()

[v_act]i(i-1)/2+j
j(j-1)/2+i
j(j-1)/2+i-1
i(i-1)/2+j-1 [/v_act]

因为是以列为主, 所以存储的序列个数为1, 2, 3…. j

对于aij, 就应该存在(注意i, j都是大于等于1的)

1 + 2 + 。。。。 + j -1 + i(最后一列只有i个)= j(j-1)/2 + i

A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()

[v_act]i(i+1)/2+j
j(j+1)/2+i
i(j+i)/2+1
j(i+1)/2+1 [/v_act]

由于是对称矩阵,因此 aij=aji

存储的时候就只需要存储一半就可以,存 n(n+1)/2 个数

当i > j s[i(i+1)/2+j] = aij

设二维数组A[1..m][1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i][j]在一维数组B中的下标为()

[v_act](i-1)*n+j
(i-1)*n+j-1
i*(j-1)
j*m+i-1 [/v_act]

A[ i, j ]在i 行前有 i – 1 行,就有(i – 1) * n 个元素,再加上它是在 j 列,所以就是 (i – 1) * n + j,注意这里数组下标是从1开始的,所以不需要减1

设有一个n行n列的对称矩阵A,将其下三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第i行的对角元素A[i][i]存放于B中()处

[v_act](i+3)*i/2
(i+1)*i/2
(2n-i+1)*i/2
(2n-i-1)*i/2 [/v_act]

“下三角” “ A[0][0]存放于B[0] ”

A[i][i]是第i+1行第i+1列元素,是第1+2+…+(i+1)=[(i+1)*(i+2)/2]个元素,又因为起始坐标是0。所以存放在[(i+1)*(i+2)/2]-1=[ (i+3)*i/2 ]处

有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()

[v_act]60
66
18000
33 [/v_act]

将非零元素所在行、列、非零元素的值构成一个三元组(i,j,v) ;

对于该题:

每个非零元素占3*2=6个字节,共10个非零元素,需6*10 = 60 个字节;

此外,还一般要用三个整数来存储矩阵的行数、列数和总元素个数,又需要3*2 = 6个字节;

总共:60 + 6 = 66 个字节。

有20 个数组,每个数组有500 个元素,并且是有序排列好的,现在在这20*500 个数中找出排名前500 的数。

[v_act]TOP-K问题,用个数为K的最小堆归并处理 [/v_act]

数组A[0..4,-1..-3,5..7]中含有元素的个数()

[v_act]55
45
36
16 [/v_act]

三维数组,5*3*3=45

用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j沿链移动的操作为()

[v_act]j=r[j].next
j=j+1
j=j->next
j=r[j]->next [/v_act]

首先链表的下一个结点应该用next指针访问,排除B

当前结点是r[j],可以排除C

r[j]是当前节点而不是指向当前节点的指针,因此用r[j].next