22、
在程序设计中,要对两个16K×16K的多精度浮点数二维数组进行矩阵求和时,行优先读取和列优先读取的区别是行优先快
23、
关于inta[10];问下面哪些不可以表示a[1]的地址?
A.a+sizeof(int)
//不正确,在32位机器上相当于指针运算a+4
B.&a[0]+1
//正确,数组首元素地址加1,根据指针运算就是a[1]的地址
C.(int*)&a+1
//正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思
D.(int*)((char*)&a+sizeof(int))
//正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4*sizeof(char),之后被转换为int*,显然是a[1]的地址
24、
若某线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪顺序表存储方式最节省时间。
线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算;
进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表。
而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。
25、
已知数组D的定义是intD[4][8];,现在需要把这个数组作为实参传递给一个函数进行处理。
下列说明汇总可以作为对应的形参变量说明的是()。
int(*s)[8],intD[][8]
int*s[8];//定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int(*s)[8];//定义一个数组指针,该指针指向含8个元素的一维数组(数组中每个元素是int型)。
区分int*p[n];和int(*p)[n];就要看运算符的优先级了。
int*p[n];中,运算符[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。
int(*p)[n];中()优先级高,首先说明p是一个指针,指向一个整型的一维数组。
26、
线性表的顺序存储结构是一种随机存取的存储结构,
顺序存储就是以数组的形式存储,那我们取某个元素就可以直接以下标的形式取出,不需要像链表那样从头遍历,所以是随机存取
27、
对n个记录的线性表进行快速排序为减少算法的递归深度,每次分区后,先处理较短的部分。
在快速排序中,需要使用递归来分别处理左右子段,递归深度可以理解为系统栈保存的深度,先处理短的分段再处理长的分段,可以减少时间复杂度;
如果按长的递归优先的话,那么短的递归会一直保存在栈中,直到长的处理完。
短的优先的话,长的递归调用没有进行,他是作为一个整体保存在栈中的,所以递归栈中的保留的递归数据少一些。
28、
三元组转置:
(1)将数组的行列值相互交换
(2)将每个三元组的i和j相互交换(3)重排三元组的之间的次序便可实现矩阵的转置
29、
数组比线性表速度更快的是原地逆序
(1)原地逆序
(2)返回中间节点(3)选择随机节点
30、
A,线性表逻辑上是线性的,存储上可以是顺序的,可以是链式的
B,顺序存储和链式存储各有优缺点
C,链式存储可以连续,可以不连续,存储时不管其连续还是不连续,都是用指针指向下一个结点
D,二维数组是顺序存储的线性表,其元素都是线性表的元素,二维数组是其数组元素为线性表的线性表。
E,插入、删除和搜索是数据结构应该具备的基本操作
31、
用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j沿链移动的操作为j=r[j].next。
32、
当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是list。
C++STL的实现:
(1).vector底层数据结构为数组,支持快速随机访问
(2).list底层数据结构为双向链表,支持快速增删
(3).deque底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
(4).stack底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
(5).queue底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时
(6).45是适配器,而不叫容器,因为是对容器的再封装
(7).priority_queue的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现
(8).set底层数据结构为红黑树,有序,不重复
(9).multiset底层数据结构为红黑树,有序,可重复
(10).map底层数据结构为红黑树,有序,不重复
(11).multimap底层数据结构为红黑树,有序,可重复
(12).hash_set底层数据结构为hash表,无序,不重复
(13).hash_multiset底层数据结构为hash表,无序,可重复
(14).hash_map底层数据结构为hash表,无序,不重复
(15).hash_multimap底层数据结构为hash表,无序,可重复
33、
在java中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度.。
如下,1,2,3可以通过编译,4,5不行。
而String是Object的子类,Stringa[]、String[]a、Objecta[]均可定义一个存放50个String类型对象的数组。
(1).Stringa[]=newString[50];
(2).Stringb[];
(3).charc[];
(4).Stringd[50];
(5).chare[50];
34、
几种常见的数据结构的操作性能对比如下图所示
由上图可见,平衡二叉树的查找,插入和删除性能都是O(logN),其中查找和删除性能较好;哈希表的查找、插入和删除性能都是O
(1),都是最好的。
35、
有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。
假设N较大,本机内存也很大,可以存下A、B和结果矩阵。
那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?
A按行存,B按行存。
我们来看看传统的分块矩阵相乘:
很明显依然是行乘以列的方式。
再来看看Strassen矩阵相乘:
同样是分块,只是计算方式不同
很明显,涉及到行的加法(a+b,c+d,e+f,g+h),列的减法(f-h,g-e,b-d,a-c),对角线的加法(a+d,e+h)以及行列的乘法,所以无论是
∙A按行存,B按行存。
∙A按行存,B按列存。
计算速度都是差不多的。
36、
既希望较快的查找又便于线性表动态变化的查找方法是哈希法查找
37、
在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较:
比如ABCDEFGH,通过8进4的方式,A与B比较,C与D比较.....然后再4进2,A与C比较(假设A,C比B,D大),E与G比较。
再2进1,比如A与E比较(假设A,E比C,G大)选出最大的A,总共7次。
然后次大的数一定是被最大数PK下去的,所以再选BCE三个比较2次得到次大的数
A
AE
ACEG(7次)ABCDEFGH
再选BCE中最大的(2次),共9次,不过可以这个方法比较次数是少一点,但是所需要的空间大,要记下与沿途的最大值比较的数。
38、
数组指针和指针数组有什么区别
数组指针只是一个指针变量,它占有内存中一个指针的存储空间;
指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间;
数组指针(也称行指针)
定义int(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。
也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
inta[3][4];
int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义int*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。
这里执行p+1是错误的,这样赋值也是错误的:
p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int*p[3];
inta[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int*p[3]表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。
指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
39、
【0、2、1、4、3、9、5、8、6、7】是以数组形式存储的最小堆,删除堆顶元素0后的结果是
【1、2、5、4、3、9、7、8、6】
首先,题目有问题,[0,2,1,4,3,9,5,8,6,7],原数组是这样才对得上号。
第二,堆是一种经过排序的完全二叉树,最小堆:
根结点的键值是所有堆结点键值中最小者。
根据这个不难写出原来堆依次为顶层0第二层21第三层4395第四层867
第三,最小堆删除堆顶后,用最后一个元素暂代堆顶,然后变成顶层7第二层21第三层4395第四层86,7>2>1,故1和7对调,对调后顶层1第二层27第三层4395第四层86;因