zhgw01

腾讯面试中一道题

题目:1分钟内用户上线的数目是60万,如果用户在5分钟内重复上线,就给他发警告,问如何设计?

考虑:要判断用户是否在5分内重复上线,那么至少要(也只需要)保存距当前时刻5分钟内的登录用户的信息(只要简单的ID)
           从这个开始出发,需要考虑的问题为2个:
           1.如何在迅速判断用户是否在保存的数据中 (这个理所当然想道用hash)
           2. 如果把过期的数据删掉  (这个就想到维护一个时间链表,把到期的通过链表来删除)


这个是半年前腾讯面试的时候碰到的题目,当时觉得很难,今天走在路上突然想起,想了想,突然想到这种方法,也许不是最好,但至少解决了,也了解了一件事

posted on 2009-04-16 20:39 apacs 阅读(2495) 评论(10)  编辑 收藏 引用 所属分类: 算法

Feedback

# re: 腾讯面试中一道题 2009-04-16 22:08 func

为啥不能为每个用户追加一个登录时间字段呢?
每次登录,判断下时间。

请教~  回复  更多评论   

# re: 腾讯面试中一道题 2009-04-17 17:50 Mark

也就是一个时间链表,一个5段的循环Buffer. 每段循环Buffer使用HashTable就OK了。  回复  更多评论   

# re: 腾讯面试中一道题[未登录] 2009-04-27 15:19 terry

@func
因为用户数目可能很多,比如一亿个,可是我5分钟的时间最多有300万个不同的用户

如果给用户追加登录时间,当然可以用来判断是否超时,但是你准备怎么保存这些用户数据

1。如果只想保存5分钟的话,
那么我有一个用户到期了,按照你的登录时间字段,怎么迅速的找出谁过期,然后把这个数据删掉  回复  更多评论   

# re: 腾讯面试中一道题 2009-04-30 11:04 func

感谢回复

我的意思是在数据库里的相关表中追加一个登录时刻字段和下线时刻字段。每次登录时,用当前时刻比对这些时刻字段,看是不是重复上线。

我没看出题目中有清除过期数据的需求,麻烦指出一下 :)  回复  更多评论   

# re: 腾讯面试中一道题[未登录] 2009-05-06 17:43 terry

@func
这么说吧,比如我第1-5分钟上线了300万个不同的用户,第6-10分钟上线了另外300万个不同的用户
现在有600万个用户,你准备把这600万个用户的数据都保存在数据库里吗?
如果按照你的做法,50分钟就得存3000万个用户的数据 (这里假设上线的都不重复),这样就很浪费空间

因为题目的要求只有一个: 判断用户是否在5分钟之内登录,所以我只要保存距当前时间最近5分钟用户的数据,5分钟之前登录的铁定是不算重复的,保存了也没用。所以最多这需要保存300万个用户的数据,无论时间怎么推移

因为每次保存的都是最近5分钟时间的用户的数据,当时间流逝的时候,其中的数据就有一些发生了超时(即距离当前时间已经从5分钟内变成了超过5分钟),这个时候就要删掉,同时最近上线的用户也要更新进来  回复  更多评论   

# re: 腾讯面试中一道题[未登录] 2009-05-06 17:48 terry

当然你也可以说,你每次都会检查登录时刻字段距当前时刻是否超过5分钟,如果超过5分钟就删掉

假设你数据库保存的是300万个用户的数据,每一个新的时刻(比如下一秒之类的),你都得把这个300万个用户的时间检查一遍,用的时间就是O(n)了  回复  更多评论   

# re: 腾讯面试中一道题 2009-05-10 01:09 func

我觉得你这种设计只在某一类系统中有必要,比如投票系统。

投票系统中,用户一般不是注册用户,这样就不存在数据库用户表,就没法在数据库中记录用户登录时刻。就必须在内存中用某种数据结构来记录用户投票信息,即IP信息等。每次投票,都要查找一下这个数据结构,看看在一定时间中是否重复投票。

但是题目所用的文字太让人误解为注册用户登录的系统。如果是注册用户登录的系统的重复登录判断,完全可以查看用户表中最后一次登录时刻和最后一次下线时刻来做此类判断啊。  回复  更多评论   

# re: 腾讯面试中一道题 2009-05-10 01:19 func

注册用户登录的系统,上线时向数据库更新(不是添加)上线时刻,下线时向数据更新下线时刻。不需要另开个定时器啥的更新这个数据啊。
至于时间复杂度,登录一次检查一次,如果检查的时间接受不了,系统的登录本身就成问题了。所以这个不是问题。
  回复  更多评论   

# re: 腾讯面试中一道题[未登录] 2009-05-11 15:50 terry

@func
你这样子说也是有道理的,在实际中我觉得确实可以按你的这么做,可是个人的看法是面试中会考你的数据结构之类的,  回复  更多评论   

# re: 腾讯面试中一道题[未登录] 2009-09-10 20:02 noName

放在客户端就行了咯  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


My Links

Blog Stats

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜