Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Time Based Key-Value Store in C++
Suppose we have to make a timebased key-value store class called TimeMap, that supports two operations.
set(string key, string value, int timestamp): This will store the key and value, along with the given timestamp.
get(string key, int timestamp): This will return a value such that set(key, value, timestamp_prev) was called previously, with timestamp_prev <= timestamp.
Now if there are multiple such values, it must return the value where the timestamp_prev value is largest. If there are no such values, it returns the empty string (""). So if we call the functions like below −
set("foo","bar",1), get("foo",1), get("foo",3), set("foo","bar2",4), set("foo",4), set("foo",5), then the outputs will be: [null, “bar”, “bar”, null, “bar2”, “bar2]
To solve this, we will follow these steps −
Define a map m
-
The set() method will be like
insert (timestamp, value) into m[key]
-
The get() method will work as follows
ret := an empty string
v := m[key]
low := 0 and high := size of v – 1
-
while low <= high
mid := low + (high – low) / 2
-
if key of v[mid] <= timestamp, then
ret := value of v[mid] and set low := mid + 1
otherwise high := mid – 1
return ret
Let us see the following implementation to get better understanding −
Example
#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;
}
Input
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))
Output
bar bar bar2 bar2