寻找发帖“水王”

来源:互联网 发布:统计怎么下载数据 编辑:程序博客网 时间:2024/06/05 06:17

题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?


解法1:

对所有ID排序,因为该ID出现的次数超过总数的一半,对有序的序列,第N/2项即为所求ID。

解法2:

每次删除两个不同的ID,那么剩下的ID列表中,“水王”的ID次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低,从而得到答案。总的时间复杂度只有O(N),且只需要常熟的额外内存。

该思路的意思其实就是说,遇到两个不同的ID,我们就将它们一同抛弃。如果这两个ID都不是水王的ID,那挺好啊,剩下的水王的ID占的比例更多;如果这两个ID其中有一个是水王的ID,那也没关系,哥占的总数超过一半,一对一跟你同归于尽,剩的还是哥的多。

Type Find(Type* ID, int N)
{
    Type candidate;
    int nTimes, i;
    for(i = nTimes = 0; i < N; i++)
    {
        if(nTimes == 0)
        {
             candidate = ID[i], nTimes = 1;
        }
        else
        {
            if(candidate == ID[i])
                nTimes++;
            else
                nTimes--;
    }
 }
    return candidate;
}


扩展问题: 

随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?

这个扩展问题还是上题所述解法二的思路扩展,不过这次是三个ID,就是说每四个不同的ID再同时抛弃。如果这四个ID不包含这三个ID,那这三大哥肯定乐啊,剩的都是我们哥三的,如果这四个ID包含这三个ID中的其中一个或者几个,那也没关系,最坏情况就是我们哥三儿一人出一滴血,干掉其它势力一滴血,一直这么消耗最后剩下的还是我们哥儿三。


void Find(Type* ID, int N,Type candidate[3])
{
    Type ID_NULL;//定义一个不存在的ID
    int nTimes[3], i;
    nTimes[0]=nTimes[1]=nTimes[2]=0;
    candidate[0]=candidate[1]=candidate[2]=ID_NULL;
    for(i = 0; i < N; i++)
    {
        if(ID[i]==candidate[0])
        {
             nTimes[0]++;
        }
        else if(ID[i]==candidate[1])
        {
             nTimes[1]++;
        }
        else if(ID[i]==candidate[2])
        {
             nTimes[2]++;
        }
        else if(nTimes[0]==0)
        {
             nTimes[0]=1;
             candidate[0]=ID[i];
        }
        else if(nTimes[1]==0)
        {
             nTimes[1]=1;
             candidate[1]=ID[i];
        }
        else if(nTimes[2]==0)
        {
             nTimes[2]=1;
             candidate[2]=ID[i];
        }
        else
        {
             nTimes[0]--;
             nTimes[1]--;
             nTimes[2]--;
         }
    }
    return;}


0 0
原创粉丝点击