কম্পিউটার টিউটোরিয়াল

C++-এ ফাংশনের এক্সক্লুসিভ টাইম


একটি সিঙ্গেল-থ্রেডেড CPU-তে কিছু ফাংশন এক্সিকিউট হয়। প্রতিটি ফাংশন mempunyai ০ থেকে N-1 পর্যন্ত унікаল আইডি। লগগুলো টাইমস্ট্যাম্প অর্ডারে স্টোর করা থাকে যা ফাংশন কখন শুরু ও শেষ হয় তা বলে। প্রতিটি লগ স্ট্রিং ফরম্যাট: "{function_id}:{"start" | "end"}:{timestamp}"। যেমন "0:start:3" মানে আইডি ০-র ফাংশন টাইমস্ট্যাম্প ৩-র শুরুতে আরম্ভ হয়। "1:end:2" মানে আইডি ১-র ফাংশন টাইমস্ট্যাম্প ২-র শেষে শেষ হয়। একটি ফাংশনের এক্সক্লুসিভ টাইম হলো সেটি এক্সিকিউট হওয়ার সময় একক।

উদাহরণ: n = 2, logs = ["0:start:0","1:start:2","1:end:5","0:end:6"] হলে আউটপুট [3,4]। কারণ ফাংশন ০ টাইম ০-তে শুরু করে, ২ ইউনিট এক্সিকিউট হয়ে টাইম ১-এ শেষ হয়। তারপর ফাংশন ১ টাইম ২-তে শুরু করে ৪ ইউনিট এক্সিকিউট হয়ে টাইম ৫-এ শেষ হয়। ফাংশন ০ আবার টাইম ৬-তে শুরু করে টাইম ৬-এ শেষ হয়, ১ ইউনিট এক্সিকিউট হয়। মোট ফাংশন ০: ২+১=৩, ফাংশন ১: ৪।

সমাধানের ধাপগুলো:

  • ret আকার n-এর অ্যারে, st স্ট্যাক।
  • j := 0, prev := 0
  • i = 0 থেকে logs.size()-1 পর্যন্ত:
    • temp := logs[i], j := 0, id := 0, num := 0, type := খালি স্ট্রিং
    • temp[j] কোলন না হওয়া পর্যন্ত: id := id*10 + temp[j]-'0', j++
    • j++
    • temp[j] কোলন না হওয়া পর্যন্ত: type += temp[j], j++
    • j++
    • j < temp.size() रहने পর্যন্ত: num := num*10 + temp[j]-'0', j++
    • যদি type == "start":
      • যদি st খালি না হয়: ret[st.top()] += num - prev
      • st.push(id), prev := num
    • অন্যথায়:
      • x := st.top(), st.pop()
      • ret[x] += (num + 1) - prev
      • prev := num + 1
  • ret ফেরত দিন।

উদাহরণ (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. C++ কোড: সময় t-এ দাঁড়িয়ে থাকা দর্শক সংখ্যা গণনা

  2. নেক্সট ক্লোজেস্ট টাইম খুঁজে বের করা C++-এ

  3. সি++-এ ওভারলোড করা যাবে না এমন ফাংশনগুলো

  4. সি/সি++-এ বারkeley-এর অ্যালগরিদম