一直以来对一个网站用户的活跃度问题,感觉很困惑,最近公司正好碰到此问题,后来想了一下午终于有了一个结果。 本次算法以用户每天登录来决定用户的活跃情况,用户登录一次,给用户活跃度加点,但有一些特殊情况是用户偶尔连续一段时间天天登录,但偶尔好几天不登录,或一个月不登录,这样的情况下,用户的活跃度不能单纯是加,还得给用户的活跃度降低。所以想到一个分段的方法,分成若干段,这也是一个队列:
|—————最活跃 100人————| |——————很活跃 1000人————| |———————一般活跃 2000人———————————|
高—————————————————————————————————————————————————>低
先分成3段(其实可以分很多段),每段的用户数量可以自定义,用户从未登录过,都不会在这三段中,当第一次登录后,该用户会在“一般活跃”中,当用户第二次登录时,可能会跳跃到“一般活跃”的最前面(或跳到“很活跃”段的末尾);但好时间不登录就会被其他登录的用户排挤到最右边(或就不在这三段中)。
数据结构(链表):
1=>array('head'=>12,12=>array('time'=>time(),'next'=>9,'previous'=>'head'),12=>array('time'=>time(),'next'=>7,'previous'=>12),...)
2=>array('head'=>54,54=>array('time'=>time(),'next'=>13,'previous'=>'head'),13=>array('time'=>time(),'next'=>2,'previous'=>54),...)
3=>array('head'=>null)
//伪代码
pre (..(next=>c),c=>array(null)) ne (head=>d,d=>array('next'=>c,'previous'=>'head'),c=>array(),e=>array()....) (.....)
ne => pre
if(len>100){
pre[lastid2]['next']=uid;
pre[uid] = array('time'=>time(),'next'=>null);
ne[lastid] = pre[lastid];
ne[lastid]['next']=ne['head'];
unset(pre[lastid]);
unset(ne[ne['head']]);
ne['head']=lastid;
}else{
pre[lastid]['next'] = uid;
pre[uid] = array('time'=>time(),'next'=>null);
delkey = ne['head'];
ne['head'] = ne[delkey]['next'];
unset(ne[ne['head']]);
}
//c => head的后面
ne[ne[c]['previous']]['next']=ne[c]['next'];
unset(ne[c]);
//运行结果:
Array
(
[1] => Array
(
[head] => 333
[333] => Array
(
[time] => 1290004104
[previous] => head
[next] =>
)
)
[2] => Array
(
[head] =>
)
[3] => Array
(
[head] => 888
[888] => Array
(
[time] => 1290004131
[next] =>
[previous] => head
)
)
)