我有一个unordered_map,键表示一小时内的分钟数(从0到60),值表示该分钟的事件数。
我想要的是在给定的窗口大小中检查总和事件是否高于某个阈值。
例如,让我说我有这个unordered_map = [(4,3),(5,2),(7,2)]
窗口大小= 3(分钟)
阈值= 6
所以在这个例子中,我没有超过6个事件的3分钟窗口,但是如果窗口大小是= 4则那么。
最好的方法是什么?我想将unordered_map复制到地图上,因为它的键被排序了。
接下来我想到了一个滑动窗口,每次添加新元素并丢弃最旧的元素,但我很难做到,因为没有事件的分钟不会显示在地图(如分钟6)我该怎样克服这个? (我不想手动添加像(6,0)这样的空分钟,因为它们太多了,超过了几分钟)
谢谢
答案 0 :(得分:2)
我不知道它是否是最好的方法,但我会使用[null, null]
代替map
,使用迭代器来连续加载元素到临时unordered_map
,只要它们在窗口内并从那里检查它们的总事件
list
在cloliru上试用!
答案 1 :(得分:1)
这是否适用于您的问题?
size_t cur_idx = 0;
array<size_t, 3> window;
auto LoadEventsPerMinute = [&] (size_t minute) {
auto it = event_map.find(minute);
window[cur_idx] = (it == event_map.end()) ? 0 : it->second;
cur_idx = (cur_idx + 1) % window.size();
}
for (size_t i = 0; i < window.size() - 1; i++) {
LoadEventsPerMinute(i);
}
for (size_t i = window.size() - 1; i < 60; i++) {
LoadEventsPerMinute(i);
size_t num_events = window[0] + window[1] + window[2];
if (num_events > threshold) {
// Do your thing
}
}