Wood_K
See gull
posts - 3,  comments - 7,  trackbacks - 0

一个论坛中又一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。该“水王”发帖数目超过了总数的一半。如果你又一个当前论坛所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的水王吗?

 

分析与解法:

  首先想到的是一个最直接的方法,我们可以队所有ID进行排序。然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*log2N+N)。

 

如果一个ID出现的次数超过总数N的一半。那么,无论水王的ID是什么,这个有序的ID列表中的第N/2项(从0开始编号)一定会是这个ID(读者可以试着证明一下)。省去重新扫描一遍列表,可以节省一点算法耗费的时间。如果能够迅速定位到列表的某一项(比如使用数组来存储列表),除去排序的时间复杂度,后处理需要的时间为O(1)。

如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。看到这一点之后,就可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。新的思路,避免了排序这个耗时的步骤,总的时间复杂度只有O(N),且只需要常数的额外内存。

posted on 2009-07-09 03:10 Wood_K 阅读(1436) 评论(5)  编辑 收藏 引用

FeedBack:
# re: 寻找"发帖水王"
2009-07-09 07:51 | u2u
这个以前不是有讲过了么?用Monte-Carlo的话,取10个元素进行测试便已经能获得99.9%的正确率了。  回复  更多评论
  
# re: 寻找"发帖水王"
2009-07-09 09:11 | 李现民
这个是编程之美里的题吧?  回复  更多评论
  
# re: 寻找"发帖水王"
2009-07-09 10:26 | Bill Hsu
这题好多年了。。。  回复  更多评论
  
# re: 寻找"发帖水王"
2009-07-09 11:04 | 99读书人
不错呵呵  回复  更多评论
  
# re: 寻找"发帖水王"
2009-07-09 15:41 | 凡客诚品
你能快速找出这个传说中的水王  回复  更多评论
  

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



<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜