面试归来,问几道牛逼UNIX C/C++笔试题

1、从N个数中选出n个最大的数,写出思路和实现。

 

《编程之美》上有讲这个算法的设计与思路。

我这里简单写几个思路:

(a)如果N能在主存中一次读入,则先进行快排,然后再取前n个数。算法复杂度:O(NlogN).

(b)如果N非常大,假设不能一次读入内存,并且n不是很大的话,可以维护一个n个元素的有序队列,队列中都是每个元素都是已经读入的数中的

前n大的数字。每读入一个数就跟这n个已排序的队列进行比较,如果大于这n个元素中最小的那个元素,则替换之,由此继续,直到读取完毕,得到的有序队列就是n个最大的数。算法复杂度:O(N * n)

(c)假如对于重复出现的数只计一次,那么可以使用位向量的方法,一次读入N个数,如果某数出现则把对应的位置位。读取完毕后输出最高位的n个数。关于位向量的方法详见《编程珠玑》。该算法的复杂度是O(N)

(d)假如N能够存入主存。因为我们只关心前n个数,所以,可以借鉴快速排序的思想,随机取一个数作为枢纽元,大于枢纽的数存入一个集合A,小于枢纽的数存入一个集合B,如果集合A的元素数目大于n,则再次分割集合A。如果集合A的元素小于n,则前n大元素是 A的元素 + B中最大的(n - A的元素个数)。该算法如果枢纽元选择的好的话,收敛的很快。比(a)快很多。


2、写出一个c/s通讯程序,要求服务器端用非阻塞模式。

 

 

3、TCP/UDP的异同。


这个太泛泛了,主要说说

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值