《编程之美》——寻找发帖“水王”

原创 2015年11月19日 18:03:31

问题:
论坛中“水王”发帖的数目超过了帖子总数的一半,如果有当前论坛所有帖子的列表,求“水王”的ID。

分析与解法:
一般的想法是根据ID对列表排序,若编号从0开始第N/2个ID即为“水王”的ID。这种方法的时间复杂度即为排序的时间复杂度,选用较好的排序算法平均时间复杂度为O(nlogn)。
避免排序,时间复杂为O(N)的解法是,每次从列表中删除两个不同的ID(不管是否包括“水王”的ID),这并不影响水王的ID在剩余ID中仍然超过一半这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下ID的就是水王的ID。

代码:

int FindID(int ID[],int N)
{
    int id = 0, num = 0;
    for(int i = 0; i < N; i++)
    {
        if(num == 0)//重新记录id的值
        {
            id = ID[i];
            num = 1;
        }
        else 
        {
            if(id == ID[i])
                num++;
            else
                num--;//删除两个不同的id
        }
    }
    return id;
} 

由于“水王ID超过一半”这一事实,因此num–的次数一定比num++少,因此最后num一定是个正整数,且此时的id一定记录着水王的ID。

扩展问题:
若有3个发帖很多的ID,他们的发帖数目都超过了帖子总数的1/4,快速找到这3个ID。

分析与解法:
类比原问题,从总的帖子中每次删除4个不同的ID,不影响“那三个ID在剩余ID中出现的次数仍超过1/4”这一事实,因此可以每次删除4个不同的ID,直到那3个ID。

代码:
http://blog.csdn.net/zhanglei0107/article/details/8230472

版权声明:本文为博主原创文章,未经博主允许不得转载。

编程之美2.3——发帖水王(+扩展)

发帖水王——找出数组中超一半的数 //不断找出两个不相同的数,然后把它们删掉,当再找不出不相同的数时,剩下的数就是过半的数 int findOverHalf(int *ID, int N) { ...
  • wxl3105
  • wxl3105
  • 2012年06月10日 17:39
  • 8736

编程之美2.3题目,寻找最大的发帖水王

题目代码如下: /************************************************************************/ /* 编程之美,2.3,寻找...

编程之美-2.3-寻找发帖“水王”

1. 简述     原题:简略的说,就是一个ID列表,其中每个ID都可能重复出现,其中一个ID的重复出现个数超过了列表长度的一半。要求快速找到这个ID。     扩展:ID列表中,有三个I...

编程之美_006寻找发帖水王

// 如果每次删除两个不同的ID,那么剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。看到 这一点后,就可以通过不断重复这个过程, //把ID列表中的ID总数降低(转化为更小的问题),从而...
  • adam_zs
  • adam_zs
  • 2013年01月14日 16:51
  • 698

编程之美2.3 寻找发帖“水王”

题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”...

2.3《编程之美》笔记--寻找发帖“水王”

2.3《编程之美》笔记--寻找发帖“水王”Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他...
  • johnlxj
  • johnlxj
  • 2011年03月08日 22:26
  • 258

编程之美-2.3-寻找发帖“水王”

题目:寻找一个ID列表中,有一个ID超过了总数的一半,找出这个ID 分析: 可以对ID进行排序,因为需要寻找的ID超过了一半,所以该ID列表ID[N]中,ID[N/2]一定是这个ID值。复杂度为O...

寻找发帖“水王”--《编程之美》笔记

Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数...

编程之美 寻找发帖水王 扩展问题

编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。 书中的思路是每次从列表中删除两个不同的ID,不影响“水王的ID在...

(1.5.2.3)编程之美 寻找发帖水王 扩展问题

编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。 书中的思路是每次从列表中删除两个不同的ID,不影响“水王的I...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《编程之美》——寻找发帖“水王”
举报原因:
原因补充:

(最多只允许输入30个字)