Java 使用位阵列和位掩码进行时间范围检查

Java 使用位阵列和位掩码进行时间范围检查,java,arrays,algorithm,mask,bit,Java,Arrays,Algorithm,Mask,Bit,我有一个Java集合。例如,一个条目可能看起来像[“smith”,[2012-10-208:04:232012-10-406:34:21]。《泰晤士报》有一秒钟的分辨率。我期待着输出一个用户名列表,为所有用户登录至少两次,在一段时间内,超过24小时,但不到7天的间隔 有一种简单的O(n^2)方法可以做到这一点,对于给定的用户,您可以将每个登录时间与每个其他登录时间进行比较,并检查它们是否符合要求的条件。还有一些O(nlogn)方法,例如将登录时间存储为二元搜索树,对于每个登录时间(N个),通过树

我有一个Java集合
。例如,一个条目可能看起来像
[“smith”,[2012-10-208:04:232012-10-406:34:21]
。《泰晤士报》有一秒钟的分辨率。我期待着输出一个用户名列表,为所有用户登录至少两次,在一段时间内,超过24小时,但不到7天的间隔

有一种简单的O(n^2)方法可以做到这一点,对于给定的用户,您可以将每个登录时间与每个其他登录时间进行比较,并检查它们是否符合要求的条件。还有一些O(nlogn)方法,例如将登录时间存储为二元搜索树,对于每个登录时间(N个),通过树(logn)查看是否还有另一个登录时间来满足要求

我的理解是,还有一种解决方案(O(n)或更好?),您可以从登录时间创建一个位数组(位集),并使用某种掩码检查所需的条件(至少两次登录时间间隔24小时,但间隔不到7天)。有人知道如何做到这一点吗?或者其他可能的高效(O(n)或更好)解决方案?

您可以在O(M*NlogN)中执行,其中M是用户数(集合大小),n是登录时间的平均长度(它是一个数组):


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

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