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