找水王

Posted 小辉辉123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找水王相关的知识,希望对你有一定的参考价值。

一、题目与要求
  • 题目、三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
  • 要求、如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

二、设计思路

  •   首先看到这道题,最基础的解法就是统计每个id发帖的数量,最后比较大小,这样就可以找到“水王”,不过,无疑这种方法是最麻烦的,时间复杂度为O(n^2);
  • 那么,要降低复杂度,就要考虑到这个题目的条件,“水王”发帖超过了帖子数目的一半,那么如果对所发帖子的ID进行排序,那么居中的ID必然是水王,这样便诞生了第二种解法,不过时间复杂度为O(n*log^n);仍然不是很理想
  •   为了使时间复杂度为O(n),我们可以对所有的ID进行计数,从第一个开始,计数为single=0,标记为ID0;向后遍历,如果ID1与ID0相同,那么singl+1(相当于对相同ID计数一次),否则single—1(相当于不再考虑该ID,直接删除),r如果single=0的话,标记为ID(x);最后结果即为ID(x);

三、源代码

  • // waterking.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include"iostream"
    using namespace std;
    
    void Data(int length,int A[])
    {
        cout<<"请输入ID列表:"<<endl;
        for(int i=0;i<length;i++)
        {
            cin>>A[i];
        }
    }
    
    int main()
    {
        int length;
        int single=0;
        int ID;        //设置信号量
        cout<<"请输入帖子数量:";
        cin>>length;
        int * waterking=new int [length];
        Data(length,waterking);
        for(int i=0;i<length;i++)
        {
            if(single==0)
            {
                ID=waterking[i];
                single++;
            }
            else if(waterking[i]==ID)
            {
                single++;
            }
            else
            {
                single--;
            }
        }
        cout<<"水王为:"<<ID<<endl;
        return 0;
    }

    四、实验结果

    五、结果分析

      这是很典型的要求算法优化,代码也不长,主要是考虑应该用什么样的方法实现,要怎样去实现代码的优化。要实现代码的优化,首先要解决的是找到问题解决的核心,从核心入手,才能有思路去探讨解决问题的途径。这道题中,根据条件我们可以知道,半数以上帖子都是一个ID的,所以,只要找到中间的值,就能找到所谓的水王,但是,这样的优化还不够完美,要将他的时间复杂度降为O(n^2),就要考虑相同ID和不同ID之间的关系,对于不同的ID,直接摒除,那么就可以排除水王的存在,因为水王发帖数足够大,那么最后剩下的肯定是水王。

      这个题中,代码的优化过程不是一蹴而就的,而是逐步的思考深入,找到问题的关键点才渐渐实现理想的优化过程。而这个过程,恰恰是我们需要关注的。

以上是关于找水王的主要内容,如果未能解决你的问题,请参考以下文章

找水王

找水王2

找水王续

课堂练习-找水王

找水王2

课堂练习--找水王