मान लीजिए हम एक हिट काउंटर डिजाइन करना चाहते हैं जो पिछले 5 मिनट में प्राप्त हिट की संख्या की गणना करता है। एक फ़ंक्शन होगा और वह दूसरी इकाई में टाइमस्टैम्प पैरामीटर स्वीकार करता है और हम मान सकते हैं कि कालक्रम क्रम में सिस्टम में कॉल किए जा रहे हैं (इसलिए, टाइमस्टैम्प एकरस रूप से बढ़ रहा है)। हम यह भी मानते हैं कि सबसे पुराना टाइमस्टैम्प 1 से शुरू होता है।
यह संभव है कि कई हिट एक ही समय में आ जाएं।
तो हम हिट () फ़ंक्शन को हिट करने के लिए कॉल करेंगे और हिट की गिनती प्राप्त करने के लिए हिट () फ़ंक्शन प्राप्त करेंगे।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
300 आकार का एक सरणी समय परिभाषित करें
-
300 आकार की एक सरणी हिट परिभाषित करें
-
फ़ंक्शन हिट को परिभाषित करें (), इसमें टाइमस्टैम्प लगेगा,
-
idx :=टाइमस्टैम्प मॉड 300
-
अगर समय [idx] टाइमस्टैम्प के बराबर नहीं है, तो -
-
समय [idx] :=टाइमस्टैम्प
-
हिट [idx] :=1
-
-
अन्यथा
-
हिट[idx] :=हिट[idx] + 1
-
-
फ़ंक्शन को परिभाषित करें getHits(), इसमें टाइमस्टैम्प लगेगा,
-
रिट:=0
-
इनिशियलाइज़ करने के लिए:=0, जब i <300, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
अगर टाइमस्टैम्प - समय [i] <300, तो -
-
रिट :=रिट + हिट्स[i]
-
-
-
वापसी रिट
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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)); }
इनपुट
ob.hit(1); ob.hit(2); ob.hit(3); ob.getHits(4); ob.hit(300); ob.getHits(300); ob.getHits(301);
आउटपुट
3 4 3