最常访问的最大URL序列

时间:2013-01-11 18:27:59

标签: java algorithm design-patterns data-structures tree

我有以下要求实施,这给我带来了“难题”:
我有网络服务器和各种用户(经过身份验证和登录)访问网站的各个区域(即跟随和浏览各种链接)。这些操作(或称之为浏览)正在记录到日志文件中 因此,这些文件捕获用户访问服务器的日期以及访问它的各种链接,即URL 记录的简化格式(出于解释目的)可以如下:
Timestamp User-Name URL-1
因此,为了给出我们可以拥有的日志的简化示例(假设有效日期):

Date-1 John    URL-1  
Date-1 Nick    URL-1  
Date-1 John    URL-2  
Date-1 George  URL-1  
Date-1 George  URL-2
Date-1 Eve     URL-2  
Date-1 Nick    URL-2  
Date-1 John    URL-3
Date-1 George  URL-3  
Date-1 John    URL-5  
Date-1 Nick    URL-3  
Date-1 Bill    URL-2  
Date-1 George  URL-5
Date-1 Nick    URL-5      
Date-1 Eve     URL-3                
Date-1 Eve     URL-5   
等等,可能有hundrends /数千条记录 当我说URL-1时,我指的是网站的有效网址,因此约翰和夏娃的URL-1实际上意味着他们都访问了同一个链接。在此示例中,URL-2,URL-3,URL-5是最常见的访问URL序列。

问题:我有兴趣使用此信息,并查找所有用户在日志文件和/或特定日期所涵盖的整个日期时间范围内访问的最常访问的URL序列 - 时间。
我有一些关于如何做到这一点的初步想法。例如。我的第一个想法是将所有内容存储在HashMaps中并包含每个外观的计数器,然后循环遍历地图条目以找到最大值,但在我看来它在空间和运行时都有巨大的开销。
我想的越多,它似乎就越可能有一个“标准”解决方案,例如字符串模式匹配,就会跟随KMP algorithm
然后我想是否可以使用例如后缀树,但我只知道实现一个特里和空间的复杂性,我相信O(N^2)。我知道有压缩版本,但我认为它们太复杂了,如果有更好/标准的解决方案,我不想浪费时间。

非常感谢任何建议/意见。

2 个答案:

答案 0 :(得分:3)

嗯,你说,任何建议/输入都非常受欢迎。。因此,我建议您简要介绍一下算法:

  1. 过滤所需日期范围的日志文件,收集某些List中并行的每个用户的网址序列。

  2. 在第1步之后,您有一组大序列。在此步骤中,此问题等同于查找most common substring in list of strings的任务。这已经解决了问题。

  3. UPD:之后,将URL视为"char"中的"string" {/ 1}}。

答案 1 :(得分:0)

对不起,我不认为用日志文件中的数据来实现这一点。

我看到的问题是您正在寻找最常用的序列的网址。 在您的问题中,您只有userId而不是会话指示符,这意味着您无法可靠地找到他们在单个会话期间所做的事情。在尝试找出他们正在采取的路径时,您可能会混合不同的会话。

假设您有一个sessionId,您可以创建每个会话的路径并在其上运行一些(仍然未知的)程序,以找到最常用的“弧”。