我有一个真正有趣的(至少对我来说)问题来解决(而且,不,它不是家庭作业)。这相当于这样:您需要确定用户在他的计算机前面的“会话”和“会话开始和结束时间”。算法问题:确定“用户会话”
您会得到任何用户交互的时间和最长不活动时间。如果时间大于或等于两个用户输入之间的非活动时间段,则它们是不同会话的一部分。
基本上输入我得到此(输入未经排序而我宁愿没有确定会议之前他们排序):
06:38
07:12
06:17
09:00
06:49
07:37
08:45
09:51
08:29
,并说,经过一段时间的闲置30分钟。
然后我需要找到三节:
[06:17...07:12]
[07:37...09:00]
[09:51...09:51]
如果不活动的周期为12小时,然后我只希望找到一个大的会议:
[06:17...09:51]
我怎样才能解决这个简单?
有一个不活动的最小有效期限,大约15分钟。
我宁愿不事先排序的原因是我会得到一个lot的数据,只将它们存储在内存中是有问题的。然而,这些数据中的大部分应该是同一会话的一部分(与数据量相比,会话相对较少,可能大约为数千到1(每个会话的用户输入数千)]。
到目前为止,我想读一个输入(比如06:38),并定义区间[数据max_inactivity ...数据+ max_inactivity],并为每个新的输入,使用二分(为log N)搜索它是否落入已知的时间间隔或创建新的时间间隔。
我会重复这个每个输入,使解决方案n log n AFAICT。另外,好处是它不会使用太多的内存,因为它只会创建间隔(并且大多数输入将落入已知间隔)。另外,每次如果落在已知区间内,我都必须改变区间的下限或上限,然后查看是否需要与下一个区间“合并”。例如(为30分钟不活动的最大期):
[06:00...07:00] (because I got 06:30)
[06:00...07:00][07:45...08:45] (because I later got 08:15)
[06:00...08:45] (because I just received 07:20)
我不知道,如果描述非常清楚,但是这是我需要做的。
这样的问题是否有名字?你将如何去解决它?
编辑
我在知道,如果我打算解决这个问题,我计划的方式,我应该使用哪种类型的数据结构非常感兴趣。我需要日志n搜索和插入/合并能力。
你如何到达交互日期未被排序的情况?你不接受他们? – 2010-08-02 11:36:04
我很想知道您的活动时间戳可能会在给定的用户会话中乱序出现。对于特定的用户,是否会实际报告13:00,14:00,13:30? – sarnold 2010-08-02 11:38:13
他们“几乎按顺序”到达,但它仍然没有秩序:它不在我的控制之下。我正在解析包含输入的文本文件(我没有生成文本文件),它们由几个来源生成,并且绝对不会被排序。 – NoozNooz42 2010-08-02 11:42:12