已经接触了一段时间的ACM(详见百度百科)了,每回刷杭电oj的题累了的时候,就喜欢去看Ranklist里面的排名,看看前面的牛人的格言,让自己有一点憧憬。有一天突然好奇杭电上的人做的总题数的数量与人数之间有怎样的分布规律,这样就可以知道大多数的人做了多少题就停了下来。

说干就干,我先用用java代码写了一个抓取上面Ranklist网页的程序到本地后,利用正则表达式解析内容并提取其中的数据,最后导入到数据库中。技术方面不想讲的太详细,只想说下其中遇到的问题。 
抓取网页速度太慢。近两千个网页似乎抓取了近十分钟,后来采取多线程抓取网页,由于学校网速还是很慢,速度只提升了几倍。 
利用正则表达式提取网页中的内容时,由于正则表达式选取的问题有些用户名中含有<  >导致一些数据提取错误,不过后来解决了。 
导入mysql数据库太慢(数据比较多),不知道是不是可以用多线程对数据库中的同一个表进行写入,如果可以的话,效率有没有提高。

获取到数据只是第一步,接下来更麻烦的工作是数据分析了。图像比较直观,先画个图像。说明:X轴代表解决题目的数目,Y轴代表解决了这么多题的人数。虽然杭电有20多万注册量,但只有前60000名刷过的题数大于等于3,我们不考虑60000名以后的。

第一次看到程序画出来的图,感到不可思议。我原先猜测图像可能会有一些波峰波谷。但是图像并没有这样的特征,而是飞速的下降直到趋于平缓。得到大致图像后,并没有结束,我想用一个函数关系来近似描述这个曲线。 
     于是我和我的室友将这些数据输入到matlab中来求拟合曲线,选取拟合程度最好的两个数据如下:

General model Power2: 
       f(x) = a*x^b+c 
Coefficients (with 95% confidence bounds): 
       a =  1.571e+004  (1.53e+004, 1.612e+004) 
       b =     -0.9897  (-1.004, -0.9758) 
       c =      -38.22  (-42.7, -33.75)

Goodness of fit: 
  SSE: 2.529e+006 
  R-square: 0.9731 
  Adjusted R-square: 0.9731 
  RMSE: 50.47

General model Exp2: 
       f(x) = a*exp(b*x) + c*exp(d*x) 
Coefficients (with 95% confidence bounds): 
       a =  4.392e+004  (-5.091e+017, 5.091e+017) 
       b =     -0.1001  (-1.629e+005, 1.629e+005) 
       c = -3.835e+004  (-5.091e+017, 5.091e+017) 
       d =     -0.1001  (-1.852e+005, 1.852e+005)

Goodness of fit: 
  SSE: 3.762e+006 
  R-square: 0.96 
  Adjusted R-square: 0.9599 
  RMSE: 61.58

拟合度最高的函数是 
       f(x) = a*x^b+c 
其中 
a =  1.571e+004  (1.53e+004, 1.612e+004) 
b =     -0.9897  (-1.004, -0.9758) 
c =      -38.22  (-42.7, -33.75)

让我们来使这个式子更简洁。我们不考虑a 和 c,而b近似于-1,最后得到

Y  =  1 / X

  想必大家都知道了,这就是我的题目是这个函数的原因。竟然是反比例函数,这代表什么涵义呢? 
  这样,我们规定刷的题越多越牛逼,那么这个函数说明了牛逼的程度和牛逼的人数成反比。这是什么破结论啊,不用这个我都知道啊。不过我实在没想出好的自然语言去解释这个式子,不知道读者们有什么看法。 
  但是我们更深入的去分析数据,发现刷了400题以下的占总人数的99%,而刷题数>=400的人只有1%,那些刷题过了400题的,应该就是我们口中所说的大神吧。 
     这就像我们的人生的经历,每个人都想成为人群中的1%,但是大多数人都在这之前停了下来。我们会想到一切客观的因素,来叹诉命运的不公。但事实却是,我们还不够努力。

最后送一句话给那些正在实现自己梦想途中的ACMer 
做好1000道题,区域赛就可以拿金牌了。 
                                              ----郭嵩山

http://875880923.iteye.com/blog/1963400的更多相关文章

  1. http://chenzhou123520.iteye.com/blog/1811340

    http://chenzhou123520.iteye.com/blog/1811340

  2. [转]http://m635674608.iteye.com/blog/1750833

    转载地址:http://m635674608.iteye.com/blog/1750833 在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个 ...

  3. rabbitMq 转自 http://gaoyangang.iteye.com/blog/1566600

    rabbitMq  转自 http://gaoyangang.iteye.com/blog/1566600

  4. http://jinnianshilongnian.iteye.com/blog/1996071

    http://jinnianshilongnian.iteye.com/blog/1996071 http://my.oschina.net/jkcui/blog/388400 http://tian ...

  5. http://jinnianshilongnian.iteye.com/blog/2018936

    http://jinnianshilongnian.iteye.com/blog/2018936

  6. http://jadethao.iteye.com/blog/1926525

    http://jadethao.iteye.com/blog/1926525 ————————————————————————————————————————————————————————————— ...

  7. http://wsj356428476.iteye.com/blog/1655032

    http://wsj356428476.iteye.com/blog/1655032 http://jingyan.baidu.com/article/19192ad83ce167e53e570705 ...

  8. spring mvc入门教程 转载自【http://elf8848.iteye.com/blog/875830】

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

  9. 《C和指针(Pointer on c)》 学习笔记(转自:http://dsqiu.iteye.com/blog/1687944)

    首先本文是对参考中三个连接的博客进行的整理,非常感谢三位博主的努力,每次都感叹网友的力量实在太强大了…… 第一章 快速上手 1.  在C语言中用/*和*/来注释掉这段代码,这个实际上并不是十分的安全, ...

随机推荐

  1. Linux初识二

    1. Linux上常用的文件管理命令及使用 (1) CP命令:复制文件或文件夹语法格式 cp [OPTION]... [-T] SOURCE DEST // 单源复制 cp [OPTION]... S ...

  2. RedHat 和 Mirantis OpenStack 产品的版本和功能汇总和对比(持续更新)

    Mirantis 和 Red Hat 作为 OpenStack 商业化产品领域的两大领军企业,在行业内有重要的地位.因此,研究其产品版本发布周期和所支持的功能,对制定 OpenStack 产品的版本和 ...

  3. [No0000A2]“原始印欧语”(PIE)听起来是什么样子?

    "Faux Amis"节目中经常提到"原始印欧语"(PIE)——"Proto-Indo-European". 我们说过,英语,法语中的&qu ...

  4. [LeetCode] Shortest Word Distance III 最短单词距离之三

    This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...

  5. [LeetCode] Binary Tree Upside Down 二叉树的上下颠倒

    Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that ...

  6. git详解

    Git使用教程   source: http://www.cnblogs.com/tugenhua0707/p/4050072.html 一:Git是什么? Git是目前世界上最先进的分布式版本控制系 ...

  7. 用vue.js学习es6(六):Iterator和for...of循环

    一.Iterator (遍历器)的概念: 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只 要部署Iterator接口,就可以完成遍历操 ...

  8. 函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法

    1. 用法一 LOCATE(substr,str) POSITION(substr IN str) 函数返回子串substr在字符串str中第一次出现的位置.如果子串substr在str中不存在,返回 ...

  9. 尝试在你浏览器的Console(F12)中运行一下,你会发现页面被不同的颜色块高亮了(css调试中学到的js)

    现在到处都是JavaScript,每天都能知道点新东西.一旦你入了门,你总能从这里或是那里领悟到很多知识. 一旦我发现一些有意思的东西,我喜欢去感觉他们的源代码,看一看它是怎么办到的. 今天我想分享A ...

  10. python学习之路 第三天

    1.set集合:去掉重复字段 set.difference()找出不同并创建一个新的集合,不改变原来集合: set.difference_update() 改变原来集合,剔除掉括号内容: set.di ...