手机分配短讯id的面试题目
题目
TopLanguage论坛里有讨论一个面试题目,内容如下:
有个老的手机短信程序,由于当时的手机CPU,内存都很烂。所以这个短信程序只能记住256条短信,多了就删了。
每个短信有个唯一的ID,在0到255之间。当然用户可能自己删短信,现在我们收到了一个新短信,请分配给它一个唯一的ID。说白了,就是请你写一个函数:
byte function(byte* ids);
该函数接受一个ids数组,返回一个可用的ID,由于手机很破,我要求你的程序尽量快,并少用内存。注意:ids是无序的。
Miro的分析在这里: http://www.cnblogs.com/miloyip/archive/2010/08/31/idalloc_clarify.html
我的分析
我觉得,因为短消息发送的频率很低,那么我们不需要考虑取ID和释放ID的响应速度问题,主要问题放在如何节约空间.那么,最节约空间的是按照比特来存储ID是否使用.
还有就是,重新整理了需求,需要提供一个释放和获取ID的接口.
解法
代码如下,没有测过,保证有错:
#define SIZE_COUNT 256/8
struct manager {
byte map[SIZE_COUNT];
byte alloc();
void dealloc(byte id);
};
//获取ID
byte alloc(){
for(int i=0; i<SIZE_COUNT; i++){
byte data = map[i];
if (data == 255) continue; //全满了
for(int j=0; j<8; j++){
if (((data >> j) & 1) == 0) {
//got it!
data |= 1<<j;
return i*8 + j;
}
}
}
}
//释放ID
dealloc(byte id){
map[id/8] &= ~(1<<(id % 8));
}
结论
上面的解法速度上还是很慢的,如果ID空间长期处于半饱和,那么每次获取都要循环一遍数组,那么效率无法接受,因此要考虑更复杂的链表方式,但是这样一来空间就不会最小了.
建立时间: 2010/10/26 14:53:00
blog comments powered by Disqus