Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631169
  • 博文数量: 87
  • 博客积分: 3399
  • 博客等级: 中校
  • 技术积分: 1422
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 21:20
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(51)

2011年(33)

2010年(2)

分类: C/C++

2012-03-22 21:44:04

Q: 某论坛有个水王,他发帖的数目超过了帖子总数的一半,如果你有这个论坛的所有帖子,且帖子作者ID也在表中,如何快速找到这个水王?

A:

解法一:

对所有的ID排序,扫描一遍排好序的ID列表,统计各ID的次数,超过一般的即是。

算法时间复杂度:O(NlogN+N) ,即排序加扫描时间。

解法二:

ID排序,则第N/2项(从0开始编号)即是这个ID

时间复杂度:O(NlogN+1)

解法三:

思想:将大规模问题转化为等效的若干子问题,减小问题规模。

每次删除两个不同的ID,则剩下的ID列表中,水王的ID出现次数仍然超过一半。

时间复杂度:O(N),只需要常数的额外内存。

TYPE find(TYPE *ID, int N)

{

         TYPE candidate;

         int nTimes, i;

         for(i=nTimes=0; i

         {

                   if(0==nTimes)

                   {

                            candidate = ID[i];

                            nTimes = 1;

                   }

                   else

                   {

                            if(candidate == ID[i])

                                     nTimes++;

                            else

                                     nTimes--;

                   }

         }

         return candidate;

}

阅读(1751) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~