活跃度队列

             一直以来对一个网站用户的活跃度问题,感觉很困惑,最近公司正好碰到此问题,后来想了一下午终于有了一个结果。 本次算法以用户每天登录来决定用户的活跃情况,用户登录一次,给用户活跃度加点,但有一些特殊情况是用户偶尔连续一段时间天天登录,但偶尔好几天不登录,或一个月不登录,这样的情况下,用户的活跃度不能单纯是加,还得给用户的活跃度降低。所以想到一个分段的方法,分成若干段,这也是一个队列:


|—————最活跃 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
                )

        )

)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值