Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में कार्यों का विशेष समय

मान लीजिए कि एक सिंगल थ्रेडेड सीपीयू पर हम कुछ फंक्शन निष्पादित करते हैं। अब प्रत्येक फ़ंक्शन में 0 और N-1 के बीच एक अद्वितीय आईडी है। हम लॉग को टाइमस्टैम्प क्रम में संग्रहीत करेंगे जो वर्णन करते हैं कि कोई फ़ंक्शन कब दर्ज किया गया है या बाहर निकला है।

यहां प्रत्येक लॉग एक स्ट्रिंग है जिसे इस प्रारूप में लिखा गया है:"{function_id}:{"start" | "end"}:{timestamp}"। उदाहरण के लिए, यदि स्ट्रिंग "0:प्रारंभ:3" की तरह है, तो इसका मतलब है कि आईडी 0 वाला फ़ंक्शन टाइमस्टैम्प 3 की शुरुआत में शुरू हुआ। "1:अंत:2" का अर्थ है कि आईडी 1 वाला फ़ंक्शन टाइमस्टैम्प के अंत में समाप्त हुआ 2. किसी फ़ंक्शन का अनन्य समय इस फ़ंक्शन में बिताए गए समय की इकाइयों की संख्या है।

तो अगर इनपुट n =2 और लॉग्स =["0:start:0", "1:start:2", "1:end:5", "0:end:6"] की तरह है, तो आउटपुट होगा [3,4] हो। ऐसा इसलिए है क्योंकि फ़ंक्शन 0 समय की शुरुआत में शुरू होता है, फिर यह 2 इकाइयों को निष्पादित करता है और समय के अंत तक पहुंचता है। उसके बाद फ़ंक्शन 1 समय 2 की शुरुआत में शुरू होता है, समय की 4 इकाइयों को निष्पादित करता है और समय 5 पर समाप्त होता है। फ़ंक्शन 0 समय 6 की शुरुआत में फिर से चल रहा है, और समय 6 के अंत में भी समाप्त होता है, इस प्रकार 1 इकाई समय के लिए निष्पादित होता है। तो हम देख सकते हैं कि फंक्शन 0 कुल समय के 2 + 1 =3 यूनिट को निष्पादित करने में खर्च करता है, और फंक्शन 1 कुल समय के 4 यूनिट को निष्पादित करने में खर्च करता है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • आकार n के सरणी रिट को परिभाषित करें, स्टैक सेंट को परिभाषित करें

  • जे:=0, पिछला:=0

  • मैं के लिए 0 से लेकर लॉग सरणी के आकार तक - 1

    • अस्थायी:=लॉग [i], जे:=0, आईडी:=0, संख्या:=0, प्रकार:=खाली स्ट्रिंग

  • जबकि temp[j] एक कोलन नहीं है

    • आईडी:=आईडी * 10 + अस्थायी [जे] संख्या के रूप में

    • j को 1 से बढ़ाएँ

  • j को 1 से बढ़ाएँ

  • जबकि temp[j] एक कोलन नहीं है

    • टाइप करें:=टाइप कॉन्टेनेट टेम्प [जे]

    • j को 1 से बढ़ाएँ

  • j को 1 से बढ़ाएँ

  • जबकि j <अस्थायी का आकार

    • संख्या:=संख्या * 10 + अस्थायी [जे] संख्या के रूप में

    • j को 1 से बढ़ाएँ

  • यदि टाइप करें =प्रारंभ करें, तो

    • अगर सेंट खाली नहीं है

      • रिट [स्टैक टॉप एलिमेंट] को संख्या से बढ़ाएँ - पिछला

    • d को st में डालें, पिछला :=num

  • अन्यथा

    • x :=सेंट के ऊपर, और स्टैक के शीर्ष को हटा दें

    • ret[x] :=ret[x] + (num + 1) - पिछला

    • पिछला:=संख्या + 1

  • वापसी रिट

उदाहरण(C++)

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> exclusiveTime(int n, vector<string>& logs) {
      vector <int> ret(n);
      stack <int> st;
      int id, num;
      int j = 0;
      string temp;
      string type;
      int prev = 0;
      for(int i = 0; i < logs.size(); i++){
         temp = logs[i];
         j = 0;
         id = 0;
         num = 0;
         type = "";
         while(temp[j] != ':'){
            id = id * 10 + (temp[j] - '0');
            j++;
         }
         j++;
         while(temp[j] != ':'){
            type += temp[j];
            j++;
         }
         j++;
         while(j < temp.size()){
            num = num * 10 + temp[j] - '0';
            j++;
         }
         if(type == "start"){
            if(!st.empty()){
               ret[st.top()] += num - prev;
            }
            st.push(id);
            prev = num;
         } else {
            int x = st.top();
            st.pop();
            ret[x] += (num + 1) - prev;
            prev = num + 1;
         }
      }
      return ret;
   }
};
main(){
   vector<string> v = {"0:start:0","1:start:2","1:end:5","0:end:6"};
   Solution ob;
   print_vector(ob.exclusiveTime(2, v));
}

इनपुट

2
["0:start:0","1:start:2","1:end:5","0:end:6"]

आउटपुट

[3, 4, ]

  1. सी++ में अगला निकटतम समय

    मान लीजिए कि हमारे पास एचएच:एमएम प्रारूप में प्रतिनिधित्व किया गया समय है, तो हमें वर्तमान अंकों का पुन:उपयोग करके अगला निकटतम समय उत्पन्न करना होगा। हम अंकों का असीमित बार उपयोग कर सकते हैं। इसलिए, यदि इनपुट 19:34 जैसा है, तो आउटपुट 19:39 होगा, क्योंकि अंक 1, 9, 3, 4 में से चुनने का अगला निकटतम सम

  1. ऐसे कार्य जिन्हें C++ में अतिभारित नहीं किया जा सकता है

    फंक्शन ओवरलोडिंग को मेथड ओवरलोडिंग के रूप में भी जाना जाता है। फ़ंक्शन ओवरलोडिंग बहुरूपता की अवधारणा द्वारा प्रदान की जाने वाली विशेषता है जिसका व्यापक रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में उपयोग किया जाता है। फ़ंक्शन ओवरलोडिंग को प्राप्त करने के लिए, फ़ंक्शंस को इन शर्तों को पूरा करना चाहिए -

  1. C/C++ में बर्कले का एल्गोरिथम

    बर्कले का एल्गोरिथ्म एक एल्गोरिथ्म है जिसका उपयोग वितरित प्रणालियों में घड़ी के सिंक्रनाइज़ेशन के लिए किया जाता है। इस एल्गोरिथम का उपयोग उन मामलों में किया जाता है जब वितरित नेटवर्क के कुछ या सभी सिस्टम में इनमें से कोई एक समस्या होती है - उ. मशीन के पास सटीक समय स्रोत नहीं है। B. नेटवर्क या