数据结构复习3
1、pa与pb哪个更快
#define NUMA 10000000
#define NUMB 1000
int a[NUMA], b[NUMB];
void pa()
{
int i, j;
for(i = 0; i < NUMB; ++i)
for(j = 0; j < NUMA; ++j)
++a[j];
}
void pb()
{
int i, j;
for(i = 0; i < NUMA; ++i)
for(j = 0; j < NUMB; ++j)
++b[j];
}
解析:pb更快。测试时pb比pa快,数组a比数组b大很多,可能跨更多的页,缺页率高或者缓存命中更低,所以pb快。
2、在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行()次比较
解析:采用淘汰赛模式,经过三轮4+2+1=7次比较可以确定冠军(最大值)。
再在每轮比赛中曾经和冠军(最大值)比较过的三个数中,通过三次比较可以找出真正的亚军。(次大值)。因此共9次;
3、已知数组D的定义是int D[4][8];,现在需要把这个数组作为实参传递给一个函数进行处理。下列说明汇总可以作为对应的形参变量说明的是()。
(A)int D[4][]
(B)int *s[8]
(C)int(*s)[8]
(D)int D[][8]
解析:二维数组在内存中也是连续存储的,他可以通过 arr[i][j]寻址是因为我们定义了这个数组有多少列,加入有N列,这样数组寻址的时候编译器会自动得到 *(arr+(j*N)+i)所以传参数的时候列数必须指定。所以D正确A不正确。B表示有8个指向int指针的数组,不对,而C中(*s)等价于s[]。因此答案CD;
4、稀疏矩阵指的是矩阵中非零元素很少的矩阵,具体少到什么程度呢?非零元素所占比例小于等于5%称为稀疏矩阵。这个时候如果用二维数组储存就太浪费空间了。所以用三元组(行,列,值)储存其中的非零元素。一个三元组就可以唯一确定一个非零元素。一组三元组加上矩阵的行、列值就可以确定这个矩阵了。三元组中除了存储非0元素的行列值外,还要存储矩阵的行数列数,总元素数三者的信息。
5、哈希表 支持直接通过关键码得到值 其实数组就是一种哈希表 下标就是关键码 通过下标直接得到值 因此哈希表肯定需要做范围检查 也有办法做范围检查的 支持直接通过关键码得到值 其实数组就是一种哈希表 下标就是关键码 通过下标直接得到值 因此哈希表肯定需要做范围检查 也有办法做范围;
6、在一个元素个数为N的数组里,找到升序排在N/5位置的元素的最优算法时间复杂度是O(n),BFPRT算法可以做到或者桶排基排之类的。
7、既希望较快的查找又便于线性表动态变化的查找方法是()
A顺序查找
B折半查找
C索引顺序查找
D哈希法查找
解析:选D;
8、 关于 int a[10]; 问下面哪些不可以表示 a[1] 的地址?
A a+sizeof(int)
B &a[0]+1
C (int*)&a+1
D (int*)((char*)&a+sizeof(int))
解析:sizeof(int)=4,因此A为a+4错误。BC明显对,D由于先转成了char型,加4个偏移量刚好是a[1],因此是正确的。
9、下面数据结构能够支持随机的插入和删除操作、并具有较好的性能的是____。
A 数组和链表
B 链表和哈希表
C 哈希表和队列
D 队列和堆栈
E 堆栈和双向队列
F 双向队列和数组
解析:数组和队列都可以排除,数组的好处是随机存取,如果要是随机插入和删除的话要移动大量元素;队列的好处是在头删除、尾插入,不适于随机插入和删除。(1)链表为什么可以呢?链表只需要把插入和删除位置附近的指针修改一下就OK了(2)哈希表为什么可以呢?插入的话,直接通过哈希函数找到对应的位置,如果冲突的话,稍作处理就可以了;同样删除的话,也是找到指定元素的位置,看当前位置是否是该元素(有可能冲突),如果是,直接删除,如果不是,根据选择的解决冲突的策略很容易找到该元素。
10、下列说法错误的是
A 数组是一种对象
B 数组属于一种原生类
C int number=[]={31,23,33,43,35,63}
D数组的大小可以任意改变
解析:Java中的那些基本类型属于原生类,而数组是引用类型,不属于原生类,可以看成是一种对象。而C中的数组声明和初始化的格式不对。组的大小一旦指定,就不可以进行改变。因此BCD。
11、稀疏矩阵压缩存储后,必会失去随机存取功能(判断)
解析:稀疏矩阵在采用压缩存储后将会失去随机存储的功能。因为在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和它所在的行、列号做为一个结点存放在一起,这样的结点组成的线性表中叫三元组表,它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。