AMEX@Twitter太无耻了# Money - 海外理财
r*n
1 楼
在Log中找用户最多的3连击问题,有最后结论吗?
Userid PageID
A 1
A 2
A 3
B 2
B 3
C 1
B 4
A 4
找出最常用的3个访问序列:
对于用户A:1-2-3, 2-3-4
用户B:2-3-4
2-3-4 是最常见的
我大致想想,是这么做的,建一个map >用来扫描log文件
,每当针对一个usr_id,list size达到3时,把这个三链接做成t_hits结构,作为key放
到另外一个map里存起来,然后把list头的第一个pageID去掉,
这样子扫描完毕后,第二个map里就是三连击的counter map.
但是要找到最大的三连击,还得再扫描一次第二个map。觉得效率不够高?关键map_t_
hits里面的value还可能在变化,不然是个静态的,直接往个heap里插,最后顶上就是
最大的了。
大致结构如下,欢迎点评:
struct t_hits
{
int f_page;
int s_page;
int t_page;
};
map > map_hit;
map map_t_hits;
scan records:
foreach( record: r in log)
{
if(map_hit.count(r.userid) >0)
{
map_hit[r.uid].second.push_back(r.pageID);
if(map_hit[r.uid].second.size() ==3) //found a three page hits for
this user
{
list tmp=map_hit[r.uid].second;
t_hits(tmp[0],tmp[1],tmp[2]);
if( map_t_hits.count(t_hits) >0)
map_t_hits[t_hits]++;
else
map_t_hits[t_hits]=1;
}
}
else
{
list tmp(r.pageID);
map_hit[r.uid]=tmp;
}
}
iterate map_t_hits once to locate its key(t_hits) with highest value
Userid PageID
A 1
A 2
A 3
B 2
B 3
C 1
B 4
A 4
找出最常用的3个访问序列:
对于用户A:1-2-3, 2-3-4
用户B:2-3-4
2-3-4 是最常见的
我大致想想,是这么做的,建一个map
,每当针对一个usr_id,list size达到3时,把这个三链接做成t_hits结构,作为key放
到另外一个map
这样子扫描完毕后,第二个map里就是三连击的counter map.
但是要找到最大的三连击,还得再扫描一次第二个map。觉得效率不够高?关键map_t_
hits里面的value还可能在变化,不然是个静态的,直接往个heap里插,最后顶上就是
最大的了。
大致结构如下,欢迎点评:
struct t_hits
{
int f_page;
int s_page;
int t_page;
};
map
map
scan records:
foreach( record: r in log)
{
if(map_hit.count(r.userid) >0)
{
map_hit[r.uid].second.push_back(r.pageID);
if(map_hit[r.uid].second.size() ==3) //found a three page hits for
this user
{
list
t_hits(tmp[0],tmp[1],tmp[2]);
if( map_t_hits.count(t_hits) >0)
map_t_hits[t_hits]++;
else
map_t_hits[t_hits]=1;
}
}
else
{
list
map_hit[r.uid]=tmp;
}
}
iterate map_t_hits once to locate its key(t_hits) with highest value