在时间戳间隔中查找出现的模式

时间:2016-06-30 06:24:44

标签: python algorithm timestamp

给定一组时间戳(纪元时间),其中每个时间戳代表事件发生的时间

timestamps = [1467267654, 1467267657, 1467267660, ... 146726821]

我必须搜索30秒的间隔,其中出现的次数大于5。

因此,如果 i j 之间至少有5个项目,并且时间戳[j] -timestamps [i]&lt; = 30秒< / strong>,然后返回true。

这里使用的算法是什么?请记住我使用python,所以它可能已经在numpy下实现了。任何建议都有帮助。

2 个答案:

答案 0 :(得分:0)

由于数据已排序,因此一次通过就足够了。以下列方式遍历数组:

  • 记住当前索引i,让我们调用此索引start
  • i增加到i = start + 4a[i] > a[start] + 30:在第一种情况下返回true,在第二种情况下更新start = start + 1并继续

总复杂度:O(n)

<强>加成

  • 如果你想要返回所有这些间隔,那么在你找到合适的间隔的情况下,记住它的边界并继续
  • 如果您想要返回最长的间隔时间,那么当您找到i = start + 4 a[i] < a[start] + 30时,请不要停止,但要进一步延长间隔时间。当您最终遇到索引j,以便a[j] > a[start] + 30记住当前最长间隔的范围时,请更新start = start + 1并继续

答案 1 :(得分:0)

尝试所有时间戳对4个索引,直到找到差异小于30秒的那个。

for i in range(len(timestamps) - 4):
    if timestamp[i + 4] - timestamp[i] <= 30:
        return true
return false

问题陈述后,无需报告间隔位置。该循环完全进行I+1次比较,其中I是第一个匹配区间的索引(N - 4,如果没有)。

最佳案例1比较,最差案例N-4,预期案例p(E(I)+1)+(1-p)(N-4)其中E(I)Ip的期望值是存在合适间隔的概率。

采用更现代,效率更低的风格(timestamp缩写为t),

reduce(lambda a, b: a or b, [t[i + 4] - t[i] <= 30 for i in range(len(t) - 4)])