First solution -> HashMap + list
time complexity of set() ---- O(1) best case, O(n) worst case, because ArrayList needs to be rearranged in case internal array is overflowed.
time complexity of get() ---- O(log n) since we perform binary search
Second solution -> HashMap + TreeMap
time complexity of set() ---- O(log k) , because we're updating a TreeMap with k number of timestamps.
time complexity of get() ---- O(log n) , because tree map internally uses binary search tree for sorting out the elements.
ask timestamp is ordered, increasing?
for the question, so we want the value ( timestamp <= query input's timestamp, closest one)
so can leverage treemap's floorKey() (treeMap<timestmap, value> or
2. use BS to find the closest value (timestamp <= query input's timestamp)
HashMap + list , Binary search (append to list set() is better! O(1))
from constraint:
All the timestamps timestamp of set are strictly increasing.
so in actually, we can use bs in List
protectedStringbinarySearch(List<Data> list,int time) {int low =0, high =list.size() -1;while (low +1< high) {int mid = (low + high) >>1;if (list.get(mid).time<= time) { low = mid; } else { high = mid; } }// we want closest time, so compare end firstif (list.get(high).time<= time) {returnlist.get(high).val; }if (list.get(low).time<= time) {returnlist.get(low).val; }return""; }
T: set: O(1), get: O(1) + O(logn), n is list len
S: O(m*n), m - hashmap size, n - each list size
classTimeMap {classData {String value;int time;Data(String value,int time) {this.value= value;this.time= time; } }Map<String,List<Data>> map;publicTimeMap() {this.map=newHashMap<>(); }publicvoidset(String key,String value,int timestamp) {map.computeIfAbsent(key, k ->newArrayList<>());map.get(key).add(newData(value, timestamp)); }publicStringget(String key,int timestamp) {if (!map.containsKey(key)) {return""; }returnbinarySearch(map.get(key), timestamp); }privateStringbinarySearch(List<Data> list,int timestamp) {int start =0;int end =list.size() -1;while (start +1< end) {int mid = start + (end - start)/2;if (list.get(mid).time<= timestamp) { start = mid; } else { end = mid; } }// we want closest time, so compare end firstif (list.get(end).time<= timestamp) {returnlist.get(end).value; }if (list.get(start).time<= timestamp) {returnlist.get(start).value; }return""; }}/** * Your TimeMap object will be instantiated and called as such: * TimeMap obj = new TimeMap(); * obj.set(key,value,timestamp); * String param_2 = obj.get(key,timestamp); */
HashMap + TreeMap
T: set: O(logn), get: O(1) + O(logn), n is treemap size
S: O(m*n), m - hashmap size, n - each treemap size
floorKey()-> the first greatest number <= given key;
ceillingKey()_> the first smaller number >=given key;
String get(String key, int timestamp)
Returns a value such that set was called previously,
with timestamp_prev <= timestamp. (so use floorKey)