给定一个整数数组和一个整数值K我的任务是编写一个函数,该函数将标准输出中的该值的最大数字和之前的K个条目打印到标准输出。
示例输入:
tps: 6, 9, 4, 7, 4, 1
k: 3
示例输出:
6
9
9
9
7
7
有人告诉我,我编写的代码可以为大型数据集提高效率。如何才能使此代码最有效?
def tweets_per_second(tps, k):
past = [tps[0]]
for t in tps[1:]:
past.append(t)
if len(past) > k: past = past[-k:]
print max(past)
答案 0 :(得分:6)
使用单调队列可以实现线性时间复杂度(对于任何k值,O(n))。这个想法如下:
让我们保持对的双端队列(值,位置)。最初,它是空的。
当新元素到达时,请执行以下操作:当前元素的位置超出范围(小于i-K)时,弹出它。虽然后面元素的值小于新元素,但弹出它。最后,将一对(当前元素,其位置)推到双端队列的后面。
当前位置的答案是双端队列的前面元素。
每个元素仅添加到双端队列一次,最多删除一次。因此,时间复杂度是线性的,它不依赖于K.这个解决方案是最优的,因为只读取输入是O(n)。
答案 1 :(得分:3)
尝试使用heap来实现从O(K)
到O(logK)
时间内降低最大操作的复杂性。
(-tps[i])
*,i in range(0,k)
和输出(-heap[0])
tps[i]
删除tps[i-k]
,并打印(-heap[0])
总的来说,你得到一个O(N log(K))算法,而你现在使用的是O(N * K)。如果K不小,这将非常有用。
*由于堆的实现将heap [0]中的min(堆)作为不变量,如果添加-value
,-heap[0]
将是max(heap)
,如您所愿
答案 2 :(得分:0)
import pandas as pd
df = pd.DataFrame(dict(data=[6, 9, 4, 7, 4, 1]))
df['running_max'] = pd.expanding_max(df.data)
df['rolling_max'] = pd.rolling_max(df.data, 3, min_periods=0)
print df
data running_max rolling_max
0 6 6 6
1 9 9 9
2 4 9 9
3 7 9 9
4 4 9 7
5 1 9 7