setAll哈希表
哈希表统一设置值
【题目】
哈希表put
、get
和containsKey
三个操作的时间复杂度为O(1)。
现添加setAll
操作:将所有记录的value都设成统一的值,并要求时间复杂度为O(1)。
算法思路
将每个值立即设置为统一值,必须需要遍历整个哈希表,为时间复杂度为O(N),
而题目要求setAll
操作时间复杂度为O(1)。
因此想到使用时间戳,每次统一设置的值为常数,只需在get
操作时比较存储在哈希表中值的时间和setAll
操作的时间,即可得知逻辑上获取的值(靠近后面时间的值为真实值)。
本质上为延迟操作,将setAll
操作的设置值时间分散到get
操作的比较时间中。因此存储在哈希表中的数据与真实数据存在不一致(有可能是setAll
中的值)。
相应代码
# 给存储的value和setAll操作加上时间戳,比较时间判断之前的存储的value是否受到setAll操作影响
# 通过延迟操作,将setAll操作的时间分散到get的时间判断中
class MyValue():
def __init__(self, value, time):
self.value = value
self.time = time
def get_value(self):
return self.value
def get_time(self):
return self.time
class MyHashMap():
def __init__(self):
self.map = {}
self.time = 0
self.set_all = MyValue(-1, self.time)
def put(self, key, value):
self.time += 1
self.map[key] = MyValue(value, self.time)
def get(self, key):
self.time += 1
if self.map[key].get_time() < self.set_all.get_time():
return self.set_all.get_value()
else:
return self.map[key].get_value()
def containsKey(self, key):
self.time += 1
return key in self.map
def setAll(self, value):
self.time += 1
self.set_all = MyValue(self.time, value)
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!