时间范围检查位数组和位掩码

时间:2012-10-28 18:05:09

标签: java arrays algorithm mask bit

我有一个<String username, ArrayList loginTimes>的Java集合。例如,一个条目可能看起来像["smith", [2012-10-2 08:04:23, 2012-10-4 06:34:21]]。时间有一秒的分辨率。我希望为所有用户输入一个用户名列表,这些用户在相隔超过24小时但相隔不到7天的时间段内至少登录过两次。

有一种简单的O(n ^ 2)方法,对于给定的用户,您可以将每个登录时间与每个其他登录时间进行比较,并检查它们是否符合所需条件。还有一些O(nlogn)方法,例如将loginTimes存储为二进制搜索树,并且对于每个登录时间(其中N个),查看树(日志N)以查看是否还有另一个登录时间到符合要求。

我的理解是还有一个解决方案(O(n)或更好?),你可以从登录时间创建一个位数组(BitSet),并使用某种掩码来检查所需的条件(at至少两次登录时间相隔24小时但相隔不到7天)。有谁知道如何实现这一目标?或其他可能的有效(O(n)或更好)解决方案?

1 个答案:

答案 0 :(得分:1)

你可以在O(M * NlogN)中进行,其中M是否。用户的数量(集合的大小)和N的loginTimes的平均长度(它是一个数组):


对于集合中的每个用户执行:
1-排序loginTimes列表。这是一个O(NlogN)任务
2-扫描列表并搜索您的约束是否适用。这可以在O(N)时间内完成。

因此,对于每个用户,总成本是O(N)+ O(NlogN)=&gt; O(2N * logN)=&gt; O(NlogN)