给定一组时间戳(纪元时间),其中每个时间戳代表事件发生的时间
timestamps = [1467267654, 1467267657, 1467267660, ... 146726821]
我必须搜索30秒的间隔,其中出现的次数大于5。
因此,如果 i 和 j 之间至少有5个项目,并且时间戳[j] -timestamps [i]&lt; = 30秒< / strong>,然后返回true。
这里使用的算法是什么?请记住我使用python,所以它可能已经在numpy下实现了。任何建议都有帮助。
答案 0 :(得分:0)
由于数据已排序,因此一次通过就足够了。以下列方式遍历数组:
i
,让我们调用此索引start
i
增加到i = start + 4
或a[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)
是I
和p
的期望值是存在合适间隔的概率。
采用更现代,效率更低的风格(timestamp
缩写为t
),
reduce(lambda a, b: a or b, [t[i + 4] - t[i] <= 30 for i in range(len(t) - 4)])