Unordered_map,检查滑动窗口中的阈值
Unordered_map, check for threshold in a sliding window
我有一个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
}
}
相关文章:
- 传感器值的阈值
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- 使用阈值进行加速度计振动检测
- OpenCV Otsu的阈值:计算多个Mat对象的单个阈值
- 使用贝尔曼福特检测产品超过阈值的周期
- 为什么用于阈值矩阵元素的 Matlab 逻辑索引操作在性能上优于 mex 实现?
- 用于浮点阈值操作的 SIMD
- Java opencv inRange 阈值函数将我的图像分成三个不同的图像
- Unordered_map,检查滑动窗口中的阈值
- 一种无需使用if语句而无需使用阈值的方法
- 尝试在给定阈值下将所有像素更改为黑白
- 使用自动阈值进行分段
- 设置多部分上传阈值
- 在RGB图像上执行阈值操作
- Android -OpenCV模板与阈值匹配
- OPENCV3带有阈值函数的错误
- PPG信号的锤窗口和阈值计算
- 如何在OpenCV中阈值
- 如何使阈值窗口仅适用于我的一半图像