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

Thời gian dành riêng của các hàm trong C ++

Giả sử trên một CPU đơn luồng, chúng ta thực thi một số chức năng. Bây giờ mỗi hàm có một id duy nhất từ ​​0 đến N-1. Chúng tôi sẽ lưu trữ nhật ký theo thứ tự dấu thời gian mô tả thời điểm một hàm được nhập hoặc thoát.

Ở đây mỗi nhật ký là một chuỗi được viết theo định dạng sau:"{function_id}:{" start "|" end "}:{timestamp}". Ví dụ:nếu chuỗi giống như "0:start:3", điều này có nghĩa là hàm có id 0 bắt đầu ở đầu dấu thời gian 3. "1:end:2" có nghĩa là hàm có id 1 kết thúc ở cuối dấu thời gian 2. Thời gian dành riêng cho một chức năng là số đơn vị thời gian dành cho chức năng này.

Vì vậy, nếu đầu vào là n =2 và logs =["0:start:0", "1:start:2", "1:end:5", "0:end:6"], thì đầu ra sẽ được [3,4]. Điều này là do hàm 0 bắt đầu ở đầu thời điểm 0, sau đó nó thực hiện 2 đơn vị thời gian và đến cuối thời gian 1. Sau đó hàm 1 bắt đầu ở đầu thời điểm 2, thực hiện 4 đơn vị thời gian và kết thúc ở thời điểm 5 . Hàm 0 đang chạy lại vào đầu thời điểm 6 và cũng kết thúc vào cuối thời điểm 6, do đó thực thi trong 1 đơn vị thời gian. Vì vậy, chúng ta có thể thấy rằng hàm 0 dành 2 + 1 =3 đơn vị tổng thời gian để thực thi và hàm 1 dành 4 đơn vị tổng thời gian để thực thi.

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

  • Xác định ret mảng có kích thước n, xác định ngăn xếp

  • j:=0, trước:=0

  • cho tôi trong phạm vi từ 0 đến kích thước của mảng nhật ký - 1

    • temp:=logs [i], j:=0, id:=0, num:=0, type:=blank string

  • trong khi temp [j] không phải là dấu hai chấm

    • id:=id * 10 + temp [j] là số

    • tăng j lên 1

  • tăng j lên 1

  • trong khi temp [j] không phải là dấu hai chấm

    • type:=type concatenate temp [j]

    • tăng j lên 1

  • tăng j lên 1

  • trong khi j

    • num:=num * 10 + temp [j] là số

    • tăng j lên 1

  • if type =start, then

    • nếu st không trống

      • tăng ret [phần tử trên cùng của ngăn xếp] theo num - trước

    • chèn d vào st, prev:=num

  • nếu không thì

    • x:=top of st và xóa top of stack

    • ret [x]:=ret [x] + (num + 1) - trước

    • trước:=num + 1

  • trả lại ret

Ví dụ (C ++)

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;
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));
}

Đầu vào

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

Đầu ra

[3, 4, ]