算法的思想来自与和同事的一次聊天,做了改进,使得精度可以通过参数控制。
Frequence.h
#pragma once class Frequence { public: Frequence( int precision = 10 ); ~Frequence( ); int Check( ); private: int _precision; int _slot_num; struct stSlot { int count; int time; }; stSlot *_slot; inline int calculate( int now ); inline int get_current_slot_num( int now ); };
Frequence.cpp
#include "Frequence.h" #include <stdlib.h> #include <stdio.h> #include <time.h> static const int kMinute = 60; Frequence :: Frequence( int precision ) : _precision( precision ) { if( _precision > 60 ) _precision = 10; if( _precision <= 0 ) _precision = 10; _slot_num = kMinute / _precision + 1; _slot = ( stSlot * )calloc( _slot_num, sizeof( stSlot ) ); } Frequence :: ~Frequence( ) { free( _slot ); } int Frequence :: Check( ) { int now = time( NULL ); int current_slot_num = get_current_slot_num( now ); stSlot *current_slot = _slot + current_slot_num; int diff = now - current_slot->time; if( diff > kMinute ) { current_slot->count = 1; } else { current_slot->count++; } current_slot->time = now; return calculate( now ); } int Frequence :: calculate( int now ) { int current_slot_num = get_current_slot_num( now ); stSlot *last_slot = NULL; int total = 0; int index = 0; while( index < _slot_num - 1 ) { int last_slot_num = ( _slot_num + current_slot_num - index ) % _slot_num; last_slot = _slot + last_slot_num; int diff = now - last_slot->time; if( diff > kMinute ) { last_slot->count = 0; } total += last_slot->count; index++; } return total; } int Frequence :: get_current_slot_num( int now ) { return ( now % ( _slot_num * _precision ) ) / _precision; }
近期评论