80 求论坛在线人数

【本文链接】

http://www.cnblogs.com/hellogiser/p/online-users.html

【题目】

求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。

【分析】

一天总共有 3600*24 = 86400秒。
定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。
然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。
这样处理一遍后数组中存储了每秒中的人数变化情况。
定义另外一个长度为86400的整数数组int online_num[86400],每个整数对应这一秒的论坛在线人数。
假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0] = delta[0]。第n+1秒的人数online_num[n] = online_num[n-1] + delta[n]。
这样我们就获得了一天中任意时间的在线人数。

【代码】

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
/*
(s1,e1) (s2,e2) ...(sn,en) (si<ei)
int LEN = 24*3600 = 86400
delta[LEN]
delta[si] ++;
delta[ei] --;

online_users[LEN];

online_users[n] = online_users[n-1] + delta[n]; (1<=n<LEN)
online_users[0] = delta[0];
*/
const int LEN = 86400;

void OnlineUsersCount(vector<int> s, vector<int> e)
{
    if (s.size() != e.size())
        return;
    int delta[LEN] = {0};
    int online_users[LEN] = {0};
    // calculate count delta of every seconds
    int i;
    for (i = 0; i < s.size(); i++)
    {
        delta[s[i]] ++;
        delta[e[i]] --;
    }

// calculate online users of every seconds
    online_users[0] = delta[0];
    for (i = 1; i < LEN; i++)
        online_users[i] = online_users[i - 1] + delta[i];
}

【参考】

http://blog.csdn.net/cywosp/article/details/6724567

http://www.cnblogs.com/sooner/p/3254605.html

时间: 2024-08-21 23:15:31

80 求论坛在线人数的相关文章

笔试题大搜索1

1.实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去. 例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n):n为输入,返回最小的运算次数.给出思路(文字描述),完成代码,并分析你算法的时间复杂度.答: [cpp] view plaincopy int func(unsigned

51nod_1199 树的先跟遍历+区间更新树状数组

题目是中文,所以不讲题意 做法顺序如下: 使用先跟遍历,把整棵树平铺到一维平面中 使用自己整的区间更新树状数组模板进行相关操作. http://www.cnblogs.com/rikka/p/7359185.html 放代码如下: 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 6 /* 7 *常量MAXN用于设定树状数组的尺寸大小 8 */ 9 const long long MAXN=500233; 10 class TreeL

ASP.NET SQL 总结(2)

Sql常见面试题(总结) 1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81 张三     数学       75 李四     语文       76 李四     数学       90 王五     语文       81 王五     数学       100 王五     英语       90A: select distinct name from table  where  name not

课堂练习四

设计思想: 输入id总数,输入id;假设第一个id是水王,若水王id与下一个id不同,则消除不同的,设j等于0减一:若id相同,则j加一:最后剩下的id 为水王. 源代码: //求论坛上的水王 import java.util.Scanner; public class test4 { public static void main(String[] args){ Scanner in=new Scanner(System.in); int N; System.out.println("请输入帖

常用监控概念和术语讲解

服务器性能监控:是指针对服务器系统的运行状态以及各项指标的监控,具体的监控指标请参考:可以监控到服务器的哪些性能指标? 通过自定义监控,您能随心所欲的监控您想监控的数据,如Memcached.Java虚拟机.论坛在线人数等等. 对各种监控项目支持自定义告警设置,这样您可以更加灵活的设置告警阈值,比如PING响应时间连续3次超过200ms,或者服务器CPU最近5分钟平均负载超过10. 通过URL回调功能,您可以让告警通知发送到您指定的URL,使您能更加灵活的处理告警消息 Ping监控是指对指定的服

Oracle学习02【持续更新】

Oracle继续学习中...... 查询职位是"MANAGER"或职位不是"ANALYST"的员工(方式一) select * from emp where job='MANAGER' or not(job='ANALYST'); SQL> select * from emp where job='MANAGER' or not(job='ANALYST'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO -----

poj 1286 Necklace of Beads (polya(旋转+翻转)+模板)

Description Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are produced by rotation around the center of the circular necklace or reflection to the axis of symmetry ar

模板 - 几何基础

部分函数已验证是正确的,还没有完全验证所有的函数有没有写正确 1 #include <bits/strc++.h> 2 using namespace std; 3 4 const double eps = 1e-10; 5 int dcmp(double x){//等于0 0;大于0 1;小于0 -1 6 if(fabs(x)<eps) return 0; 7 else return x<0 ? -1 : 1; 8 } 9 struct Point{ 10 double x,y;

[IIS]IIS扫盲(六)

一:聊天室  聊天室的种类有很多,免费的聊天室也有很多,这些聊天室的ASP源码从网上都可以下载得到,我们就以毒爱聊天室为版本来教大家做.好,大家先下载毒爱聊天室,当然,本站软件下载里就有下载,下载的是一个RAR压缩包,在你的硬盘上先建一个目录,然后就其解压到这个目录里面,你会在目录里面看到很多的程序代码,不要管它.下面,打开IIS,将刚刚我跟你们说的主目录指定到这个文件夹内,然后点击确定,这下行了,打开你的IE,键入你刚刚申请的域名,你看到什么了,对,你的聊天室出来了,这时你的聊天灾室就可以用了