myślę, że jest to dość częste pytanie, ale nie wydaje się znaleźć odpowiedź przez googling wokół (może jest bardziej precyzyjna nazwa problemu nie wiem)realizacja „trafień w ostatnim [drugiego/minuta/godzina]” struktury danych
trzeba wdrożyć struktury z „hit()” stosowanej metody zgłosić hitem i hitsInLastSecond? | minute | metody godzinę. Masz zegar z dokładnością nanosekundy. Jak skutecznie to wdrożyć?
Moja myśl była mniej więcej tak (w 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;
};
to działa? Czy to jest dobre? Czy coś jest lepsze?
Aktualizacja: Dodano przycinanie i włączony do deque jak za komentarze:
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 (before == hits.end()) { return last_count; }
return last_count - before_count->second;
}
// etc for Minute, Hour
void prune() {
auto old = upper_bound(hits.begin(). hits.end(), make_pair(now - 1 * hour, -1));
if (old != hits.end()) {
hits.erase(hits.begin(), old)
}
}
deqeue<pair<time_point, int>> hits;
int last_count = 0;
};
Jeśli nie trzeba zachować historyczne hity, może chcesz oczyścić stare dane z mapy i teraz znowu inaczej będzie w końcu zabraknie pamięci. –
Zakładając, że twój "czas" jest coraz większy (i na pewno tak się wydaje), 'std :: map <>' (i związany z tym wydatek) nie powinien być konieczny, ponieważ z definicji jest to proste 'std :: vector <> 'zostanie posortowane według okoliczności, jeśli zawsze będziesz naciskać ostatnie trafienie z tyłu. To powiedziawszy, pomysł wygląda dobrze, a jak powiedział Neil, musisz wyczyścić dane poza maksymalnym oknem, najlepiej za każdym naciśnięciem przycisku. – WhozCraig
Myślałem, że time_t to tylko druga dokładność, ale mówisz, że chcesz dokładności nanosekund. –