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

Kho khóa-giá trị dựa trên thời gian trong C ++

Giả sử chúng ta phải tạo một lớp lưu trữ khóa-giá trị dựa trên thời gian được gọi là TimeMap, hỗ trợ hai hoạt động.

  • set (khóa chuỗi, giá trị chuỗi, dấu thời gian int):Điều này sẽ lưu trữ khóa và giá trị, cùng với dấu thời gian đã cho.

  • get (string key, int timestamp):Giá trị này sẽ trả về một giá trị mà tập (key, value, timestamp_prev) đã được gọi trước đó, với timestamp_prev <=timestamp.

Bây giờ nếu có nhiều giá trị như vậy, nó phải trả về giá trị mà giá trị timestamp_prev là lớn nhất. Nếu không có giá trị nào như vậy, nó trả về chuỗi rỗng (""). Vì vậy, nếu chúng ta gọi các hàm như bên dưới -

set ("foo", "bar", 1), get ("foo", 1), get ("foo", 3), set ("foo", "bar2", 4), set ("foo", 4), set ("foo", 5), thì kết quả đầu ra sẽ là:[null, "bar", "bar", null, "bar2", "bar2]

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

  • Xác định bản đồ m

  • Phương thức set () sẽ giống như

    • chèn (dấu thời gian, giá trị) vào m [key]

  • Phương thức get () sẽ hoạt động như sau

    • ret:=một chuỗi trống

    • v:=m [key]

    • thấp:=0 và cao:=kích thước của v - 1

    • trong khi thấp <=cao

      • giữa:=low + (cao - thấp) / 2

      • khóa if của v [mid] <=timestamp, then

        • ret:=giá trị của v [mid] và đặt low:=mid + 1

      • nếu không thì cao:=mid - 1

    • trả lại ret

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

Ví dụ

#include <bits/stdc++.h>
using namespace std;
class TimeMap {
   public:
   /** Initialize your data structure here. */
   unordered_map <string, vector < pair <int, string> > > m;
   TimeMap() {
      m.clear();
   }
   void set(string key, string value, int timestamp) {
      m[key].push_back({timestamp, value});
   }
   string get(string key, int timestamp) {
      string ret = "";
      vector <pair <int, string> >& v = m[key];
      int low = 0;
      int high = v.size() - 1;
      while(low <= high){
         int mid = low + (high - low) / 2;
         if(v[mid].first <= timestamp){
            ret = v[mid].second;
            low = mid + 1;
         }else{
            high = mid - 1;
         }
      }
      return ret;
   }
};
main(){
   TimeMap ob;
   (ob.set("foo","bar",1));
   cout << (ob.get("foo", 1)) << endl;
   cout << (ob.get("foo", 3)) << endl;
   (ob.set("foo","bar2",4));
   cout << (ob.get("foo", 4)) << endl;
   cout << (ob.get("foo", 5)) << endl;
}

Đầu vào

Initialize it then call set and get methods as follows:
set("foo","bar",1))
get("foo", 1))
get("foo", 3))
set("foo","bar2",4))
get("foo", 4))
get("foo", 5))

Đầu ra

bar
bar
bar2
bar2