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的异同。
这个太泛泛了,主要说说