สมมติว่าเราต้องสร้างคลาสที่เก็บคีย์-ค่าตามเวลาที่เรียกว่า TimeMap ซึ่งรองรับการทำงานสองอย่าง
-
set(string key, string value, int timestamp):สิ่งนี้จะเก็บคีย์และค่า พร้อมกับการประทับเวลาที่กำหนด
-
get(string key, int timestamp):ค่านี้จะคืนค่าที่ set(key, value, timestamp_prev) ถูกเรียกก่อนหน้านี้ โดยมี timestamp_prev <=timestamp.
ตอนนี้ หากมีค่าดังกล่าวหลายค่า จะต้องส่งคืนค่าที่ค่า timestamp_prev ใหญ่ที่สุด หากไม่มีค่าดังกล่าว จะคืนค่าสตริงว่าง ("") ดังนั้นหากเราเรียกใช้ฟังก์ชันด้านล่าง −
set("foo","bar",1), get("foo",1), get("foo",3), set("foo","bar2",4), set("foo", 4), set("foo",5) จากนั้นผลลัพธ์จะเป็น:[null, “bar”, “bar”, null, “bar2”, “bar2]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดแผนที่ ม
-
วิธี set() จะเป็นแบบนี้
-
แทรก (ประทับเวลา, ค่า) ลงใน m[คีย์]
-
-
เมธอด get() จะทำงานดังนี้
-
ret :=สตริงว่าง
-
v :=m[คีย์]
-
ต่ำ :=0 และสูง :=ขนาดของ v – 1
-
ในขณะที่ต่ำ <=สูง
-
กลาง :=ต่ำ + (สูง – ต่ำ) / 2
-
ถ้าคีย์ของ v[mid] <=timestamp แล้ว
-
ret :=ค่าของ v[mid] และตั้งค่าต่ำ :=mid + 1
-
-
สูงอย่างอื่น :=กลาง – 1
-
-
รีเทิร์น
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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; }
อินพุต
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))
ผลลัพธ์
bar bar bar2 bar2