Unordered_map,在滑动窗口中检查阈值

时间:2017-05-10 12:53:11

标签: c++

我有一个unordered_map,键表示一小时内的分钟数(从0到60),值表示该分钟的事件数。

我想要的是在给定的窗口大小中检查总和事件是否高于某个阈值。

例如,让我说我有这个unordered_map = [(4,3),(5,2),(7,2)] 窗口大小= 3(分钟) 阈值= 6

所以在这个例子中,我没有超过6个事件的3分钟窗口,但是如果窗口大小是= 4则那么。

最好的方法是什么?我想将unordered_map复制到地图上,因为它的键被排序了。

接下来我想到了一个滑动窗口,每次添加新元素并丢弃最旧的元素,但我很难做到,因为没有事件的分钟不会显示在地图(如分钟6)我该怎样克服这个? (我不想手动添加像(6,0)这样的空分钟,因为它们太多了,超过了几分钟)

谢谢

2 个答案:

答案 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
  }
}