Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 시간 기반 키-값 저장소

<시간/>

두 가지 작업을 지원하는 TimeMap이라는 시간 기반 키-값 저장소 클래스를 만들어야 한다고 가정합니다.

  • set(string key, string value, int timestamp):주어진 타임스탬프와 함께 키와 값을 저장합니다.

  • get(string key, int timestamp):이전에 timestamp_prev <=timestamp.

    로 set(key, value, timestamp_prev)가 호출된 값을 반환합니다.

이제 이러한 값이 여러 개 있으면 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[key]

      에 (타임스탬프, 값) 삽입
  • get() 메서드는 다음과 같이 작동합니다.

    • ret :=빈 문자열

    • v :=m[키]

    • 낮음 :=0 및 높음 :=v의 크기 – 1

    • 낮음 <=높음

      동안
      • 중간 :=낮음 + (높음 – 낮음) / 2

      • v[mid] <=타임스탬프의 키인 경우

        • 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