我有以下要求实施,这给我带来了“难题”:
我有网络服务器和各种用户(经过身份验证和登录)访问网站的各个区域(即跟随和浏览各种链接)。这些操作(或称之为浏览)正在记录到日志文件中
因此,这些文件捕获用户访问服务器的日期以及访问它的各种链接,即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)
。我知道有压缩版本,但我认为它们太复杂了,如果有更好/标准的解决方案,我不想浪费时间。
非常感谢任何建议/意见。
答案 0 :(得分:3)
嗯,你说,任何建议/输入都非常受欢迎。。因此,我建议您简要介绍一下算法:
过滤所需日期范围的日志文件,收集某些List
中并行的每个用户的网址序列。
在第1步之后,您有一组大序列。在此步骤中,此问题等同于查找most common substring in list of strings的任务。这已经解决了问题。
UPD:之后,将URL
视为"char"
中的"string"
{/ 1}}。
答案 1 :(得分:0)
对不起,我不认为用日志文件中的数据来实现这一点。
我看到的问题是您正在寻找最常用的序列的网址。 在您的问题中,您只有userId而不是会话指示符,这意味着您无法可靠地找到他们在单个会话期间所做的事情。在尝试找出他们正在采取的路径时,您可能会混合不同的会话。
假设您有一个sessionId,您可以创建每个会话的路径并在其上运行一些(仍然未知的)程序,以找到最常用的“弧”。