我认为这是一个相当常见的问题,但我似乎无法通过谷歌搜索找到答案(也许有一个更准确的名称,我不知道的问题?)
您需要使用"hit()"方法实现一个结构,该方法用于报告命中和hitsInLastSecond | Minute | Hour方法.你有一个具有纳秒准确度的计时器.你如何有效地实现这一目标?
我的想法是这样的(在psuedo-C++中)
class HitCounter {
void hit() {
hits_at[now()] = ++last_count;
}
int hitsInLastSecond() {
auto before_count = hits_at.lower_bound(now() - 1 * second)
if (before_count == hits_at.end()) { return last_count; }
return last_count - before_count->second;
}
// etc for Minute, Hour
map<time_point, int> hits_at;
int last_count = 0;
};
Run Code Online (Sandbox Code Playgroud)
这有用吗?好吗?有更好的东西吗?
更新:添加修剪并根据评论切换到双端队列:
class HitCounter {
void hit() {
hits.push_back(make_pair(now(), ++last_count));
}
int hitsInLastSecond() {
auto before = lower_bound(hits.begin(), hits.end(), make_pair(now() - 1 * second, -1));
if …Run Code Online (Sandbox Code Playgroud) 我试图实现移动平均线的某些东西.
在该系统中,不保证每个时间段的整数数量.我需要计算每个时期的平均值.因此,我不能简单地按数量滑过整数列表,因为这与时间无关.
我可以记录每个值及其相关时间.我们将通过系统运行大量数据,因此"垃圾收集"旧数据非常重要.
值得注意的是,我需要在每个周期结束后将平均值保存到磁盘.但是,在将数据保存到磁盘和引入新时段的数据之间可能会有一些重叠.
我可以使用哪些高效的数据结构来存储,滑动和垃圾收集这类数据?