Computer >> Máy Tính >  >> Lập trình >> C ++

Thiết kế bộ đếm lượt truy cập trong C ++

Giả sử chúng ta muốn thiết kế một bộ đếm lượt truy cập đếm số lượt truy cập nhận được trong 5 phút qua. Sẽ có một hàm chấp nhận một tham số dấu thời gian trong đơn vị thứ hai và chúng tôi có thể giả định rằng các lệnh gọi đang được thực hiện đến hệ thống theo thứ tự thời gian (do đó, dấu thời gian tăng đơn điệu). Chúng tôi cũng giả định rằng dấu thời gian sớm nhất bắt đầu từ 1.

Có thể một số lần truy cập đến gần như cùng một lúc.

Vì vậy, chúng ta sẽ gọi hàm hit () để truy cập và hàm getHits () để tính số lần truy cập.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định thời gian của mảng có kích thước 300

  • Xác định số lần truy cập mảng có kích thước 300

  • Xác định một hàm hit (), điều này sẽ lấy dấu thời gian,

  • idx:=timestamp mod 300

  • nếu thời gian [idx] không bằng dấu thời gian, thì -

    • time [idx]:=timestamp

    • lượt truy cập [idx]:=1

  • Nếu không

    • hits [idx]:=hits [idx] + 1

  • Xác định một hàm getHits (), hàm này sẽ lấy dấu thời gian,

  • ret:=0

  • để khởi tạo i:=0, khi tôi <300, hãy cập nhật (tăng i lên 1), thực hiện -

    • nếu dấu thời gian - time [i] <300, thì -

      • ret:=ret + hits [i]

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
class HitCounter {
public:
   vector<int< time;
   vector<int< hits;
   HitCounter(){
      time = vector<int<(300);
      hits = vector<int<(300);
   }
   void hit(int timestamp){
      int idx = timestamp % 300;
      if (time[idx] != timestamp) {
         time[idx] = timestamp;
         hits[idx] = 1;
      }
      else {
         hits[idx] += 1;
      }
   }
   int getHits(int timestamp){
      int ret = 0;
      for (int i = 0; i < 300; i++) {
         if (timestamp - time[i] < 300) {
            ret += hits[i];
         }
      }
      return ret;
   }
};
main(){
   HitCounter ob;
   ob.hit(1);
   ob.hit(2);
   ob.hit(3);
   cout << (ob.getHits(4)) << endl;
   ob.hit(300);
   cout << (ob.getHits(300)) << endl;
   cout << (ob.getHits(301));
}

Đầu vào

ob.hit(1);
ob.hit(2);
ob.hit(3);
ob.getHits(4);
ob.hit(300);
ob.getHits(300);
ob.getHits(301);

Đầu ra

3
4
3