1. 100亿条记录的文本文件,取出重复数最多的前10条。(小顶堆,N*log10;可以先对文件进行一次哈希划分,分布式处理)
2.求一个数组中第k大的数的位置。(小顶堆?)
3.有10W个IP段,这些IP段之间都不重合,随便给定一个IP,求出属于哪个IP段。 (折半?)
4.一个一维数轴上的不同线段,求重复最长的两个线段。
5.有向带权图最短路径(dij)
6.LINUX编程,包括所有互斥的方法,多线程编程,进程间的通信。
7.36.利用互斥量和条件变量设计一个消息队列,具有以下功能:1)创建消息队列(消息中所含的元素);2)消息队列中插入消息;3)取出一个消息(阻塞方式);4)取出第一个消息(非阻塞方式)。注意互斥量,条件变量和队列系统提供。
3. 生产者和消费者模型:
使用信号灯和互斥量。
semaphore mutex = 1;
semaphore fillCount = 0;
semaphore emptyCount = BUFFER_SIZE;
procedure producer() {
while(true) {
item = produceItem();
down(emptyCount);
down(mutex);
putItemIntoBuffer(item);
up(mutex);
up(fillCount);
}
}
procedure consumer() {
while(true) {
down(fillCount);
down(mutex);
item = removeItemFromBuffer();
up(mutex);
up(emptyCount);
consumeItem(item);
}
}
不使用信号灯和互斥量。
volatile unsigned int produceCount, consumeCount;
TokenType buffer[BUFFER_SIZE];
void producer(void) {
while (1) {
while (produceCount - consumeCount == BUFFER_SIZE)
sched_yield(); // 缓冲区满
buffer[produceCount % BUFFER_SIZE] = produceToken();
produceCount += 1;
}
}
void consumer(void) {
while (1) {
while (produceCount - consumeCount == 0)
sched_yield(); // 缓冲区空
consumeToken( buffer[consumeCount % BUFFER_SIZE]);
consumeCount += 1;
}
}