笔试题

一. TCP协议如何保证传输的可靠性

答:

1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。

2、数据校验
3、数据合理分片和排序:
  UDP协议:当IP数据报大于1500字节, 即大于最大传输单元(MTU)时,发送方IP层就需要分片(fragmentation),把数据报分成若干片,使每一片都小于MTU。而接收方IP层则需要进行数据报的重组,这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报,将导致丢弃整个UDP数据报。
  tcp协议:会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。
4、流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。

5、拥塞控制:当网络拥塞时,减少数据的发送。

二. 计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是___(大端模式)____(小端模式)。x86结构的计算机使用 ()模式。

答:

大端:数据的高字节保存在内存的低地址;

小端:数据的高字节保存在内存的高地址。

x86计算机使用小端模式。

A=0x123456,十六进制,1位为4bit,所以1个字节占2位。高位字节0x12,低位字节0x56。
计算机内存中,地址为由低到高。因此:
大端:最低地址存放的为其最高字节,0x12;

小端:最低地址存放的为其最低字节,0x56。

比如说:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位,如下:
高地址
  ---------------
  buf[3] (0x78) -- 低位
  buf[2] (0x56)
  buf[1] (0x34)
  buf[0] (0x12) -- 高位
  ---------------
  低地址
Little-Endian: 低地址存放低位,如下:
高地址
  ---------------
  buf[3] (0x12) -- 高位
  buf[2] (0x34)
  buf[1] (0x56)
  buf[0] (0x78) -- 低位
  --------------
低地址



三. 已知有一个关键字序列:(19,14,23,1,68,20,84,27,55,11,10,79)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为()。

答:

主要考察哈希表的链地址存储,分别计算每个数据的查找程度,如下所示:
地址为0:14(1)  84(2)
地址为1:1(1)
2:23(1)  79(2)
3:10(1)
4:11(1)
5:19(1) 68(2)
6:20(1) 27(2) 55(3)

平均查找程度=(1+2+1+1+2+1+1+1+2+1+2+3)/12 = 18/12 = 1.5

四. 设数组定义为a[60][70],每个元素占2个存储单元,数组按照列优先存储,元素a[0][0]的地址为1024,那么元素a[32][58]的地址为( )

答:

a[60][70]有60行、70列,a[32][58]位于整个数组的33行、59列处,因为数组按照列优先存储,所以a[32][58]前面一共有(59-1)*60+(33-1)=58*60+32=3512个元素,每个元素占2个存储单元,则一共占3512*2=7024个存储单元,又因为a[32][58]的地址在2个存储单元的最前端,所以其地址为1024+7024=8048

五. 二叉查找树的查找最好时间复杂度O(logN),最坏时间复杂度O(N)。

六. 散列表的地址区间为0-17,散列函数为H(K)=K mod 17。采用线性探测法处理冲突,并将关键字序列26,25,72,38,8,18,59依次存储到散列表中。
(1)元素59存放在散列表中的地址是 ( D ) 。
A . 8         B.   9        C.  10       D.  11
(2)存放元素59需要搜索的次数是 ( C )。

A . 2         B.  3         C.  4        D.   5

七. 某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间
A. 单链表
B. 仅有头指针的单循环链表
C. 双链表

D. 仅有尾指针的单循环链表

答:

该问题分为两部分:

问题实质是用最快的时间找到 最后一个元素 ,和 头元素, 根据尾指针通过O(1)的时间找到最后一个元素,然后根据链表是单循环,往前移动一个元素就是头元素,综上所述答案为:仅有尾指针的单循环链表

有的同学不明白B和D的区别,我解释一下:B虽然可以直接获得第一个元素,但是想要获得最后一个元素却需要遍历整个链表。而D给出的是带有尾结点的单循环链表,这样就可以直接得到最后一个元素,想要得到第一个元素只需要再遍历一个元素就可以,所以选择D

八. 设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用()最节省时间

A. 带头结点的双循环链表
B. 单循环链表
C. 带尾指针的单循环链表
D. 单链表

答:选择A

不带头节点的话你就需要在其他地方存储链表的长度了吧。带头节点的链表如果在头节点不存储链表长度而是 直接存储尾节点的地址,这样就可以达到最省了。

C是加入好加,但是删除不好删,因为需要找到末尾节点的前一个节点!!!!

1.删除最有一个元素需要找到倒数第二个元素,光有尾指针只能找到最后一个元素,否则就需要从第一个元素开始遍历找倒数第二个元素
2.而循环链表则很快能找到倒数第二个元素
3.插入元素只要找到最后一个元素即可,是不是循环链表不要求

九. 以下哪些线程同步锁可以为递归锁
1.信号量  2.读写锁   3.互斥量   4.事件   5.临界区(Critical Section)
A. 1,3,4,5
B. 5
C. 3,5

D. 1,3,5

答:C
进程/线程同步方法:
常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。
在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。
递归锁/非递归锁:
Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。 递归锁也叫可重入锁(reentrant mutex),非递归锁也叫不可重入锁(non-reentrant mutex)。
二者唯一的区别是:
同一个线程可以多次获取同一个递归锁,不会产生死锁。
如果一个线程多次获取同一个非递归锁,则会产生死锁。
Windows下的Mutex和Critical Section是可递归的。

Linux下的pthread_mutex_t锁是默认是非递归的。可以通过设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递归锁。

十.  以下情况下不一定出现TCP分节RST的情况是:

A. 服务器端端口未打开而客户端来连接时
B. SO_RCVTIMEO选项设置了超时时间并超时
C. 服务器主机崩溃后重启
D, 在一个已关闭的socket上收到数据

答:C

四种情况会发送RST包:
1、端口未打开
2、请求超时
3、提前关闭
4、在一个已关闭的socket上收到数据

C选项的意思应该是,服务器主机崩溃后重启,它的TCP丢失了崩溃前的所有连接信息,若服务器TCP收到来自客户的数据分节,就会响应一个RST。
但如果客户机在服务器崩溃后并没有发送任何数据分节,那服务器重启后也就不会产生RST

十一. 一个二叉树有N个度为2的节点,求叶节点的数目为多少?

A. N-1
B. N
C. N+1
D. N+2

答:C

除根节点外,每个度为 2 的节点都贡献一个叶节点。而根节点贡献两个叶节点。
故为 N+1。

n个结点的二叉树,度只可能是0,1,2,分别设其对应的结点个数为n0,n1,n2,则有n=n0+n1+n2;
又n结点的树只有n-1条边,故n-1=n1+2*n2

两式联合起来,可等到等式n0=n2+1

十二. 下列选项中,不可能是快速排序第2趟排序结果的是 ()

A. 2,3,5,4,6,7,9
B. 2,7,5,6,4,3,9
C. 3,2,5,4,7,6,9
D. 4,2,3,5,7,6,9

答:C

四个选项都是同样的数组元素,若完全有序,应为2345679
每经过一趟快排,轴点元素都必然就位,也就是说,一趟下来至少有1个元素在其最终位置
所以考察各个选项,看有几个元素就位即可。
A:2、3、6、7、9
B:2、9
C:9
D:5、9

第二趟至少应有2个元素就位,所以C不对。

十三. 对下列四个序列用快速排序方法进行排序,以序列的第一个元素为划分的基准。在第一趟划分过程中,元素的移动次数最多的序列是
A.70,75,68,23,10,16,90,82
B.82,75,70,16,10,90,68,23
C.70,75,82,90,23,16,10,68
D.23,10,16,70,82,75,68,90

答: C





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值