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

Unordered_map, check for threshold in a sliding window

本文关键字:窗口 阈值 map 检查 Unordered      更新时间:2023-10-16

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

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

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

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

解决这个问题的最佳方法是什么?我想将unordered_map复制到地图上,因为它是键排序的。

接下来我想到有一个滑动窗口,每次添加新元素并删除最旧的元素,但我在这样做时遇到了麻烦,因为没有事件的分钟不会显示在地图中(如第 6 分钟(m 我如何克服这个问题?(我不想手动添加像 (6,0( 这样的空分钟数,因为它们太多了,比事件分钟数还要多(

谢谢

我不知道

这是否是最好的方法,但我会选择map而不是unordered_map,使用迭代器将连续元素加载到临时list,只要它们在窗口内并从那里检查它们的总事件

std::map<int, int> map{ {4,3},{5,2},{7,2} };
std::list<std::pair<int, int>> list;
const int threshold = 6, window = 4;
for (auto it = map.begin(); it != map.end(); ++it)
{
    while (list.size() > 0 && it->first - list.front().first >= window)
        list.pop_front();
    list.push_back(*it);
    int count = 0;
    for (auto e : list)
        count += e.second;
    if (count > threshold)
        std::cout << "over threshold" << std::endl;
}
std::cout << "end" << std::endl;

在克洛里鲁身上试试吧!

这对你的问题有用吗?

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