2016腾讯校招研发笔试(三)
2015-09-11 18:28
281 查看
1.我们常说的mvc框架是指的什么的?
2.对某二叉树进行先序遍历的结果是ABDEFC,中序遍历的结果是DBFEAC,则后序遍历的结果是()
3.
有一个如下的结构体:
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
64位下int为4字节,long和指针为8字节,参看:/article/1980323.html
4.以下不属于tcp连接断开的状态是?
TCP连接断开的状态包括:FIN-WAIT-1(服务器端主动关闭TCP,等待客户端发送ACK时服务器端的状态)、
CLOSE-WAIT、
FIN-WAIT-2(服务器端收到ACK后的状态)、
LASR-ACK、
TIME-WAIT(只要一方处于此状态,连接不能再用)、
CLOSE
5.下面关于ICMP协议的描述中,正确的是()
6.有如下一个类似跳表的数据结构:每层都是已经排好序的链表,level1层的链表有所有元素,levelN层的链表只有levelN-1的1半的元素,levelN层的结点指向levelN-1层中相同的结点。请问查找一个元素的时间复杂度是:
基本的二分查找时间复杂度O(logn)
7.在一个单CPU的处理机中,有P1,P3,P5三个作业,有两个IO设备IO1,IO2,并且能够实现抢先式多任务并行工作的多道程序环境中,投入运行优先级由高到低P5,P1,P3三个作业,他们使用设备的先后顺序和占用设备的时间分别为:P1:IO2(10ms) CPU(10ms) IO1(30ms)CPU(10ms)P3:IO1(30ms)
CPU(10ms) IO2(30ms)CPU(10ms)P5:CPU(20ms) IO1(30ms) CPU(10ms) IO2(15ms)忽略其他的时间损耗,3个作业投入到全部完成的情况下。请问下列哪些选项为IO2的设备利用率?
因为是抢占式的,所以优先级最高的P5会优先执行,不用等待任何资源。
然后考虑P1,同一时刻CPU或者IO资源只能一个进程访问。
8.C语言里i=5,j=7,请问i|j等于多少?
9.
请选择下面代码的输出结果
c*a*b++:相当于c*a*b;b+=1;两条语句
b++ 是先把 b 作为表达式的结果,然后再去做 b = b +1
c*a*(b++):这样的话迷惑性更大,但是这样跟没有括号是一样的,还是先b计算,然后再b+=1;
b++和++b在没有用在计算时候其实是一样的,只有用在计算的表达式里时候才会有先计算再加1还是先加1再计算的问题
10.
请问下列代码的输出结果有可能是哪些()?
要考虑大小端两种情况,
union:内部数据结构占用相同内存,即int_32t和struct占用同一块内存区域,所以向a中赋值相当于是向bc中
大端:高字节放低字节:c为高字节放0810,b低字节放2015
小端:高字节放高字节:c为高字节,放2015,b低字节放0810
11.
如下代码,result变量的输出结果是多少?
注意:初始化列表里的变量是根据变量声明顺序赋值的,先赋值初始化列表后再运行构造函数中的程序
fir=1++;相当于fir=1;1++;这两条语句,所以fir=1
sec=2++=2,
thd=3++=3;
for=thd;for是thd的引用;thd=i=4;所以for=4
所以:1+2+4+4=11
12.在动态分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此需要修改空闲区表,造成空闲区数减1的情况是()
作业归还分区,要调整空闲区表,把空闲区表调整成空闲区长度递减的次序排列登记。可变分区分配方式下,当收回主存时,应检查是否有与归还区相邻的空闲区,若有,则应合并成一个空闲区。
相邻可能有上邻空闲区、下邻空闲区、既上邻又下邻空闲区、既无上邻又无下邻空闲区四种情况。
有上邻空闲区,但无下邻空闲区.只修改上邻空闲区长度(为收回的空闲区长度与原上邻区长度之和),空闲区数不变
无下邻空闲区,但有下邻空闲区.改记录这个下邻空闲区记录的地址为收回空闲区的地址,长度为下邻空闲区的长度和收回空闲区的长度,空闲区数不变
有上邻空闲区,也有下邻空闲区.改记录上邻区记录的长度(为上邻区长度、下邻区长度和收回区长度之和),再把下邻区记录的标志位改为空,即空闲区数-1
无上邻空闲区,也无下邻空闲区.那么找一个标志位为空的记录,记下该回收区的起始地址和长度,且改写相应的标志位为未分配,表明该登记栏中指示了一个空闲区。 空闲区数+1
13.对于移动平均算法,是计算某变量之前n个数值的算术平均,正确的说法是
任何一个算法不同情况下可能有多种解法,一般我们以时间复杂度为评判的话,就会用牺牲空间换时间。
这个算法最明显的有两种解法,
1.每次进来一个变量n,就遍历前面n个数,然后求和,再取平均,这样的话时间复杂度为O(n),空间为O(1);
2.以空间换时间:从前往后没计算一次保留一次求和值到一个辅助空间,这样计算下一个的时候直接取得前一个和值加上当前数,再取平均得到当前平均,这样的话时间复杂度为O(1),空间为O(n)
14.某一速率为100M的交换机有20个端口,其一个端口上连着一台笔记本电脑,此电脑从迅雷上下载一部1G的电影需要的时间可能是多久?
交换机为独占带宽,即每个端口数据通过率为为最大100Mb/s。注意单位是Mb。因此最短时间(只有一台机器连接时候)为:
1GB/(100Mb/s)=1024MB/(12.5MB/s)=81.92s。
15.在linux编程中,以下哪个TCP的套接字选项与nagle算法的开启和关闭有关?
当有一个TCP数据段不足MSS,比如要发送700Byte数据,MSS为1460Byte的情况。nagle算法会延迟这个数据段的发送,等待,直到有足够的数据填充成一个完整数据段。也许有人会问,这有什么影响呢?没有太大的影响,总体上来说,这种措施能节省不必要的资源消耗。但是要发送的总体数据很小时,这种措施就是拖后腿了。比如,用户请求一个网页,大约十几KB的数据,TCP先发送了八九个数据包,剩下几百字节一直不发送,要等到另一个RTT才发送,这时候前面发送数据的ACK已经返回了。这样的用户体验是很不好的。 所以,现在很多服务器都选择主动关闭nagle算法,因为带宽够大,资源消耗不是问题,速度反而是个大问题。
从上述描述中,禁用 nagle,实质就是不在延迟 TCP_NODELAY
16.某二叉树的先根遍历序列和后根遍历序列正好相反,则该二叉树具有的特征是()
原理如下:
先序遍历顺序是:M-L-R;
后序遍历顺序是:L-R-M;
可以看到,只有中间的结点(M)顺序变化了,左右结点相对位置是不变的。那可以推断出,要满足题意的话“二叉树的先序序列与后序序列正好相反”,说明整个二叉树左子树或者右子树有一个没有(遍历就成了,先:M-L ;后:L-M 或者 先:M-R ;后:R-M )也就是必然是一条链。
所以只有A对了。
标准答案应是: 任一结点都无左孩子或任一结点都无右孩子:相当于竖直的
17.已知关系R(F,G,H,I,J)及其上的函数相关性集合,F=(F->G,J->F,HJ->I),该关系的候选关键字是:
如果一个 超关键字 去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字”(Candidate
Key)。候选关键字既能唯一地确定记录,它包含的字段又是最精炼的。也就是说候选关键字是最简单的超关键字。
排除掉含有g f i的
18.
win32系统里,下面几个sizeof的运行结果是()
19.若系统中有五台打印机,有多个进程均需要使用两台,规定每个进程一次仅允许申请一台,则在不发生死锁的情况下至多允许______个进程参与竞争
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。
1 )互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2 )请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3 )不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4 )环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
因此为了避免发生死锁,则不能生成此资源的环形链,则4个进程是极限了。
哲学家就餐问题:当5个进程的时候如果都同时申请到了1台,就发生死锁了。如果是4个进程,那必然有一个能申请到2台。
20.在正方体上任取三个顶点连成三角形,则所得的三角形是直角非等腰三角形的概率为?
共有8个顶点,总有C(8,3);
任取一顶点,过该顶点取其中一个面的对角线,仅有一条过该顶点并且垂直于该面的边,每个顶点共有3个面,故共有3个三角形,总数为,8*3
如下图A点
21.以下哪个是由权值集合(16,8,4,2)构造的哈夫曼树(最优二叉树):
最优二叉树,是指WPL(带权路径长度之和)最小
WPL(A):16*1+8*2+2*3+3*4=50
WPL(B):2*1+4*2+8*3+16*3=82
WPL(C):16*1+4*2+8*3+2*3=54
WPL(D):16*2+8*2+4*2+2*2=60
所以选A
22.关于红黑树和***L树,以下哪种说法不正确?
关于红黑树和***L树,来自网络:
1 好处 及 用途
红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
红黑树能够以 O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构
能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和***L相同,但统计性能比***L树更高。
当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。
在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。
典型的用途是实现关联数组
2 ***L树是最先发明的自平衡二叉查 找树。在***L树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。***L树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在
1962 年的论文 "An algorithm for the organization of information" 中发表了它。
引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度.为此,就必须每向二叉树插入一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度.
***L树的定义:
一棵***L树满足以下的条件:
1>它的左子树和右子树都是***L树
2>左子树和右子树的高度差不能超过1
从条件1可能看出是个递归定义,如GNU一样.
性质:
1>一棵n个结点的***L树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)
2>一棵n个结点的***L树的平均搜索长度保持在0(log2(n)).
3>一棵n个结点的***L树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).
从1这点来看 红黑树是牺牲了严格的高度平衡的优越条件 为 代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和***L相同,但统计性能比***L树更高.
23.客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成功的,那么当第4个RTT时间内发送的所有TCP段都得到了ACK时,拥塞窗口大小是:
16KB超时,阈值变为8KB,客户端从1KB开始穿(执行快开始算法)
1RTT 结束,1KB->2KB
2RTT 结束,2KB->4KB
3RTT 结束,4KB->8KB(到达阈值,执行拥塞避免算法)
4RTT 结束,8KB->9KB
结果C
拥塞避免和慢启动
当拥塞发生时(超时或收到重复确认),慢启动门限ssthresh被设置为当前拥塞窗口cwnd大小(题目为16)的一半,即8。同时cwnd重置为1。新的数据被接收,则cwnd增加,规则为ssthresh之前,慢启动,即cwnd指数增长;到达ssthresh之后,拥塞避免,即cwnd加1。
详参:http://www.cnblogs.com/ggjucheng/archive/2012/02/03/2337420.html
24.关于epoll和select的区别,哪些说法是正确的?
select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。
epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。nginx就是使用epoll来实现I/O复用支持高并发,目前在高并
发的场景下,nginx越来越收到欢迎
select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制epoll:(1)IO的效率不会随着监视fd的数量的增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数;(2)支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。(3)有着良好的就绪事件通知机制select:(1)单个进程可监视的fd数量受到了限制,在32位机器上,他所能管理的fd数量最大为1024;(2)对socket进行扫描时是线性扫描,当socket文件描述符数量变多时,大量的时间是被白白浪费掉的。
25.Internet的网络层含有的协议是?
ip不用说了肯定是网络层协议,a对
icmp也不用说,icmp本质可以理解为带差错报告的ip协议,也是网络层,b对
arp是将ip地址解析为mac,rarp是arp的reverse,将mac解析为ip
所以虽然看上去他们工作都是在链路层,但是它们是网络层协议,cd也对
26.以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有:
c选项,float有精度问题,尾数不精确,比较会出问题
d选项,字符串比较,一般用strcmp(str1,str2),直接用==比较两个字符串,应该比较的是字符串的首地址是否相等,那就不是真正的字符串比较了
D估计大家都知道字符串用==比较没有意义
说说C吧,也是基本的,浮点型(double,flout)由于是用于科学计算的,尾数一定会不精确的,所以不能用==比较,Java可以用Math.abs(fVar-0.02) < 0.0000001表示等于,或者直接用Double.compare(d1, d2)比较,C也一样。
27.TCP链接中主动断开链接netstat观察可能出现的状态流转是:
中断连接端可以是client,也可以是server。
下图为client发起主动断开连接时,client和server的状态图。
详参:http://blog.csdn.net/whuslei/article/details/6667471
28.以下涉及到内存管理的代码段中,有错误的是:
new
和delete 配套使用 free和malloc配套使用 AB错误
D是因为申请的是一个元素,后面跟的12是初始化值,而不是数组,所以错误。
new和delete与free和malloc的差别是前面2个会分别调用构造函数和析构函数
29.下面哪些特性可能导致代码体积膨胀:
A宏定义会单纯的替换,也就是如果宏定义替换的内容会成倍复制,所以会导致代码膨胀
B模板的调用,会根据调用的参数,生成模板对应的实际调用的函数体,如果调用的参数不同,会生成不同的代码,所以会导致代码膨胀
C内联函数会拷贝至调用的位置,如果调用多次回导致代码膨胀
30.
小明设计了如下的学籍管理系统:
已知关系:学籍(学号,学生姓名) PK=学号
成绩(科目号,成绩,学号) PK=科目代码,FK=学号
已有表记录如下,请给出能够插入的成绩记录
成绩表中主键是“PK=科目代码”,所以 科目代码要唯一,所以可排除AC;在数据库完整性里有说:外键必须可以找到或者为空,所以 B是可以的,而D为空,所以也满足。故选BD
2.对某二叉树进行先序遍历的结果是ABDEFC,中序遍历的结果是DBFEAC,则后序遍历的结果是()
3.
有一个如下的结构体:
64位下int为4字节,long和指针为8字节,参看:/article/1980323.html
4.以下不属于tcp连接断开的状态是?
TCP连接断开的状态包括:FIN-WAIT-1(服务器端主动关闭TCP,等待客户端发送ACK时服务器端的状态)、
CLOSE-WAIT、
FIN-WAIT-2(服务器端收到ACK后的状态)、
LASR-ACK、
TIME-WAIT(只要一方处于此状态,连接不能再用)、
CLOSE
5.下面关于ICMP协议的描述中,正确的是()
6.有如下一个类似跳表的数据结构:每层都是已经排好序的链表,level1层的链表有所有元素,levelN层的链表只有levelN-1的1半的元素,levelN层的结点指向levelN-1层中相同的结点。请问查找一个元素的时间复杂度是:
基本的二分查找时间复杂度O(logn)
7.在一个单CPU的处理机中,有P1,P3,P5三个作业,有两个IO设备IO1,IO2,并且能够实现抢先式多任务并行工作的多道程序环境中,投入运行优先级由高到低P5,P1,P3三个作业,他们使用设备的先后顺序和占用设备的时间分别为:P1:IO2(10ms) CPU(10ms) IO1(30ms)CPU(10ms)P3:IO1(30ms)
CPU(10ms) IO2(30ms)CPU(10ms)P5:CPU(20ms) IO1(30ms) CPU(10ms) IO2(15ms)忽略其他的时间损耗,3个作业投入到全部完成的情况下。请问下列哪些选项为IO2的设备利用率?
因为是抢占式的,所以优先级最高的P5会优先执行,不用等待任何资源。
然后考虑P1,同一时刻CPU或者IO资源只能一个进程访问。
8.C语言里i=5,j=7,请问i|j等于多少?
9.
请选择下面代码的输出结果
c*a*b++:相当于c*a*b;b+=1;两条语句
b++ 是先把 b 作为表达式的结果,然后再去做 b = b +1
c*a*(b++):这样的话迷惑性更大,但是这样跟没有括号是一样的,还是先b计算,然后再b+=1;
b++和++b在没有用在计算时候其实是一样的,只有用在计算的表达式里时候才会有先计算再加1还是先加1再计算的问题
10.
请问下列代码的输出结果有可能是哪些()?
要考虑大小端两种情况,
union:内部数据结构占用相同内存,即int_32t和struct占用同一块内存区域,所以向a中赋值相当于是向bc中
大端:高字节放低字节:c为高字节放0810,b低字节放2015
小端:高字节放高字节:c为高字节,放2015,b低字节放0810
11.
如下代码,result变量的输出结果是多少?
注意:初始化列表里的变量是根据变量声明顺序赋值的,先赋值初始化列表后再运行构造函数中的程序
fir=1++;相当于fir=1;1++;这两条语句,所以fir=1
sec=2++=2,
thd=3++=3;
for=thd;for是thd的引用;thd=i=4;所以for=4
所以:1+2+4+4=11
12.在动态分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此需要修改空闲区表,造成空闲区数减1的情况是()
作业归还分区,要调整空闲区表,把空闲区表调整成空闲区长度递减的次序排列登记。可变分区分配方式下,当收回主存时,应检查是否有与归还区相邻的空闲区,若有,则应合并成一个空闲区。
相邻可能有上邻空闲区、下邻空闲区、既上邻又下邻空闲区、既无上邻又无下邻空闲区四种情况。
有上邻空闲区,但无下邻空闲区.只修改上邻空闲区长度(为收回的空闲区长度与原上邻区长度之和),空闲区数不变
无下邻空闲区,但有下邻空闲区.改记录这个下邻空闲区记录的地址为收回空闲区的地址,长度为下邻空闲区的长度和收回空闲区的长度,空闲区数不变
有上邻空闲区,也有下邻空闲区.改记录上邻区记录的长度(为上邻区长度、下邻区长度和收回区长度之和),再把下邻区记录的标志位改为空,即空闲区数-1
无上邻空闲区,也无下邻空闲区.那么找一个标志位为空的记录,记下该回收区的起始地址和长度,且改写相应的标志位为未分配,表明该登记栏中指示了一个空闲区。 空闲区数+1
13.对于移动平均算法,是计算某变量之前n个数值的算术平均,正确的说法是
任何一个算法不同情况下可能有多种解法,一般我们以时间复杂度为评判的话,就会用牺牲空间换时间。
这个算法最明显的有两种解法,
1.每次进来一个变量n,就遍历前面n个数,然后求和,再取平均,这样的话时间复杂度为O(n),空间为O(1);
2.以空间换时间:从前往后没计算一次保留一次求和值到一个辅助空间,这样计算下一个的时候直接取得前一个和值加上当前数,再取平均得到当前平均,这样的话时间复杂度为O(1),空间为O(n)
14.某一速率为100M的交换机有20个端口,其一个端口上连着一台笔记本电脑,此电脑从迅雷上下载一部1G的电影需要的时间可能是多久?
交换机为独占带宽,即每个端口数据通过率为为最大100Mb/s。注意单位是Mb。因此最短时间(只有一台机器连接时候)为:
1GB/(100Mb/s)=1024MB/(12.5MB/s)=81.92s。
15.在linux编程中,以下哪个TCP的套接字选项与nagle算法的开启和关闭有关?
当有一个TCP数据段不足MSS,比如要发送700Byte数据,MSS为1460Byte的情况。nagle算法会延迟这个数据段的发送,等待,直到有足够的数据填充成一个完整数据段。也许有人会问,这有什么影响呢?没有太大的影响,总体上来说,这种措施能节省不必要的资源消耗。但是要发送的总体数据很小时,这种措施就是拖后腿了。比如,用户请求一个网页,大约十几KB的数据,TCP先发送了八九个数据包,剩下几百字节一直不发送,要等到另一个RTT才发送,这时候前面发送数据的ACK已经返回了。这样的用户体验是很不好的。 所以,现在很多服务器都选择主动关闭nagle算法,因为带宽够大,资源消耗不是问题,速度反而是个大问题。
从上述描述中,禁用 nagle,实质就是不在延迟 TCP_NODELAY
16.某二叉树的先根遍历序列和后根遍历序列正好相反,则该二叉树具有的特征是()
原理如下:
先序遍历顺序是:M-L-R;
后序遍历顺序是:L-R-M;
可以看到,只有中间的结点(M)顺序变化了,左右结点相对位置是不变的。那可以推断出,要满足题意的话“二叉树的先序序列与后序序列正好相反”,说明整个二叉树左子树或者右子树有一个没有(遍历就成了,先:M-L ;后:L-M 或者 先:M-R ;后:R-M )也就是必然是一条链。
所以只有A对了。
标准答案应是: 任一结点都无左孩子或任一结点都无右孩子:相当于竖直的
17.已知关系R(F,G,H,I,J)及其上的函数相关性集合,F=(F->G,J->F,HJ->I),该关系的候选关键字是:
如果一个 超关键字 去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字”(Candidate
Key)。候选关键字既能唯一地确定记录,它包含的字段又是最精炼的。也就是说候选关键字是最简单的超关键字。
排除掉含有g f i的
18.
win32系统里,下面几个sizeof的运行结果是()
19.若系统中有五台打印机,有多个进程均需要使用两台,规定每个进程一次仅允许申请一台,则在不发生死锁的情况下至多允许______个进程参与竞争
虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。
1 )互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2 )请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3 )不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4 )环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
因此为了避免发生死锁,则不能生成此资源的环形链,则4个进程是极限了。
哲学家就餐问题:当5个进程的时候如果都同时申请到了1台,就发生死锁了。如果是4个进程,那必然有一个能申请到2台。
20.在正方体上任取三个顶点连成三角形,则所得的三角形是直角非等腰三角形的概率为?
共有8个顶点,总有C(8,3);
任取一顶点,过该顶点取其中一个面的对角线,仅有一条过该顶点并且垂直于该面的边,每个顶点共有3个面,故共有3个三角形,总数为,8*3
如下图A点
21.以下哪个是由权值集合(16,8,4,2)构造的哈夫曼树(最优二叉树):
正确答案: A 你的答案: B (错误)
最优二叉树,是指WPL(带权路径长度之和)最小
WPL(A):16*1+8*2+2*3+3*4=50
WPL(B):2*1+4*2+8*3+16*3=82
WPL(C):16*1+4*2+8*3+2*3=54
WPL(D):16*2+8*2+4*2+2*2=60
所以选A
22.关于红黑树和***L树,以下哪种说法不正确?
关于红黑树和***L树,来自网络:
1 好处 及 用途
红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
红黑树能够以 O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构
能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和***L相同,但统计性能比***L树更高。
当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。
在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。
典型的用途是实现关联数组
2 ***L树是最先发明的自平衡二叉查 找树。在***L树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。***L树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在
1962 年的论文 "An algorithm for the organization of information" 中发表了它。
引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度.为此,就必须每向二叉树插入一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度.
***L树的定义:
一棵***L树满足以下的条件:
1>它的左子树和右子树都是***L树
2>左子树和右子树的高度差不能超过1
从条件1可能看出是个递归定义,如GNU一样.
性质:
1>一棵n个结点的***L树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)
2>一棵n个结点的***L树的平均搜索长度保持在0(log2(n)).
3>一棵n个结点的***L树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).
从1这点来看 红黑树是牺牲了严格的高度平衡的优越条件 为 代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和***L相同,但统计性能比***L树更高.
23.客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成功的,那么当第4个RTT时间内发送的所有TCP段都得到了ACK时,拥塞窗口大小是:
16KB超时,阈值变为8KB,客户端从1KB开始穿(执行快开始算法)
1RTT 结束,1KB->2KB
2RTT 结束,2KB->4KB
3RTT 结束,4KB->8KB(到达阈值,执行拥塞避免算法)
4RTT 结束,8KB->9KB
结果C
拥塞避免和慢启动
当拥塞发生时(超时或收到重复确认),慢启动门限ssthresh被设置为当前拥塞窗口cwnd大小(题目为16)的一半,即8。同时cwnd重置为1。新的数据被接收,则cwnd增加,规则为ssthresh之前,慢启动,即cwnd指数增长;到达ssthresh之后,拥塞避免,即cwnd加1。
详参:http://www.cnblogs.com/ggjucheng/archive/2012/02/03/2337420.html
24.关于epoll和select的区别,哪些说法是正确的?
select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。
epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。nginx就是使用epoll来实现I/O复用支持高并发,目前在高并
发的场景下,nginx越来越收到欢迎
select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制epoll:(1)IO的效率不会随着监视fd的数量的增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数;(2)支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。(3)有着良好的就绪事件通知机制select:(1)单个进程可监视的fd数量受到了限制,在32位机器上,他所能管理的fd数量最大为1024;(2)对socket进行扫描时是线性扫描,当socket文件描述符数量变多时,大量的时间是被白白浪费掉的。
25.Internet的网络层含有的协议是?
ip不用说了肯定是网络层协议,a对
icmp也不用说,icmp本质可以理解为带差错报告的ip协议,也是网络层,b对
arp是将ip地址解析为mac,rarp是arp的reverse,将mac解析为ip
所以虽然看上去他们工作都是在链路层,但是它们是网络层协议,cd也对
26.以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有:
c选项,float有精度问题,尾数不精确,比较会出问题
d选项,字符串比较,一般用strcmp(str1,str2),直接用==比较两个字符串,应该比较的是字符串的首地址是否相等,那就不是真正的字符串比较了
D估计大家都知道字符串用==比较没有意义
说说C吧,也是基本的,浮点型(double,flout)由于是用于科学计算的,尾数一定会不精确的,所以不能用==比较,Java可以用Math.abs(fVar-0.02) < 0.0000001表示等于,或者直接用Double.compare(d1, d2)比较,C也一样。
27.TCP链接中主动断开链接netstat观察可能出现的状态流转是:
中断连接端可以是client,也可以是server。
下图为client发起主动断开连接时,client和server的状态图。
详参:http://blog.csdn.net/whuslei/article/details/6667471
28.以下涉及到内存管理的代码段中,有错误的是:
new
和delete 配套使用 free和malloc配套使用 AB错误
D是因为申请的是一个元素,后面跟的12是初始化值,而不是数组,所以错误。
new和delete与free和malloc的差别是前面2个会分别调用构造函数和析构函数
29.下面哪些特性可能导致代码体积膨胀:
A宏定义会单纯的替换,也就是如果宏定义替换的内容会成倍复制,所以会导致代码膨胀
B模板的调用,会根据调用的参数,生成模板对应的实际调用的函数体,如果调用的参数不同,会生成不同的代码,所以会导致代码膨胀
C内联函数会拷贝至调用的位置,如果调用多次回导致代码膨胀
30.
小明设计了如下的学籍管理系统:
已知关系:学籍(学号,学生姓名) PK=学号
成绩(科目号,成绩,学号) PK=科目代码,FK=学号
已有表记录如下,请给出能够插入的成绩记录
成绩表中主键是“PK=科目代码”,所以 科目代码要唯一,所以可排除AC;在数据库完整性里有说:外键必须可以找到或者为空,所以 B是可以的,而D为空,所以也满足。故选BD
相关文章推荐
- IOS imageNamed 与 imageWithContentsOfFile 区别
- [C/C++]_[VS2010使用源代码UTF8中国字符串转码ANSI问题]
- C#圆角窗体简单实现方法
- Maven pom.xml文件教程详解
- Effective C++ 条款44 将与参数无关的代码抽离template
- 0909我的编译原理感
- ubuntu安装中文输入法
- 二叉排序树相关操作
- hdoj 1342 Lotto 【全排列(从n个数中选m个数按字典需排列)】
- hdu5037Frog 贪心
- 1.类的加载机制_继承类的加载(一个小的Demo)说明
- 分享Matlab实现ksvd 算法
- 分布式事务
- 简单的打印图形
- Linux 下安装svn
- java/android http数据缓存
- java深入学习(二)
- js数据放入cookie、从cookie取cookie
- NodeJS热部署工具 — supervisor
- 8,了解HTML的代码注释