码迷,mamicode.com
首页 > 其他好文 > 详细

课堂练习——找“水王”

时间:2015-04-21 22:33:19      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

一、题目与要求
  • 题目、三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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);

三、源代码

 1 // waterking.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include"iostream"
 6 using namespace std;
 7 
 8 void Data(int length,int A[])
 9 {
10     cout<<"请输入ID列表:"<<endl;
11     for(int i=0;i<length;i++)
12     {
13         cin>>A[i];
14     }
15 }
16 
17 int main()
18 {
19     int length;
20     int single=0;
21     int ID;        //设置信号量
22     cout<<"请输入帖子数量:";
23     cin>>length;
24     int * waterking=new int [length];
25     Data(length,waterking);
26     for(int i=0;i<length;i++)
27     {
28         if(single==0)
29         {
30             ID=waterking[i];
31             single++;
32         }
33         else if(waterking[i]==ID)
34         {
35             single++;
36         }
37         else
38         {
39             single--;
40         }
41     }
42     cout<<"水王为:"<<ID<<endl;
43     return 0;
44 }

四、实验结果

技术分享

技术分享

五、结果分析

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

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

 

课堂练习——找“水王”

标签:

原文地址:http://www.cnblogs.com/zhshto/p/4445567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!