|
|
|
|
|
|
r******n 发帖数: 170 | 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 | h*********n 发帖数: 11319 | 2 经典解法: 2个hash表
hash1: key是userID,value是该用户最近两次点击的网页
hash2: key是出现过的三连击组合,value是该三连击的出现次数
【在 r******n 的大作中提到】 : 在Log中找用户最多的3连击问题,有最后结论吗? : Userid PageID : A 1 : A 2 : A 3 : B 2 : B 3 : C 1 : B 4 : A 4
|
|
|
|
|
|