Python中的快照数组
假设我们必须实现一个支持以下接口的SnapshotArray-
SnapshotArray(intlength)这将使用给定的长度初始化类似数组的数据结构。最初,每个元素等于0。
set(index,val)这将设置给定索引处的元素等于val。
snap()将获取该数组的快照并返回snap_id:我们称为snap()负1的总次数。
get(index,snap_id)这将在我们使用给定的snap_id拍摄快照时返回给定索引处的值
因此,如果数组大小为2,则使用[0,5]进行设置,然后进行捕捉,它将返回0,然后使用[0,6]和get(0,0)进行设置,这将返回5,
为了解决这个问题,我们将遵循以下步骤-
初始化方法将类似于-
当前:=0
arr:=一个长度为数组+12d数组[[0,0]]
该set()方法将像-
temp:=arr[index]的最后一个元素
如果temp[0]=current,则从arr[index]的最后一个元素开始的索引1元素:=val
否则将[current,val]插入arr[index]
该snap()方法将是-
将电流增加1,返回小于计数值1
该get()方法将像-
temp:=arr[index],low:=0,high:=temp的长度–1
从低到高
中:=低+(高–低)/2
如果temp[mid,0]<=snap_id,则低:=中,否则高:=中–1
返回温度[低,1]
示例(Python)
让我们看下面的实现以更好地理解-
class SnapshotArray(object):
def __init__(self, length):
self.current = 0
self.arr = [[[0,0]] for i in range(length+1)]
def set(self, index, val):
temp = self.arr[index][-1]
#print(temp)
if temp[0] == self.current:
self.arr[index][-1][1] = val
else:
self.arr[index].append([self.current,val])
def snap(self):
self.current+=1
return self.current -1
def get(self, index, snap_id):
temp = self.arr[index]
low = 0
high = len(temp)-1
while low < high:
mid = low + (high - low+1 )//2
if temp[mid][0]<=snap_id:
low = mid
else:
high = mid -1
return temp[low][1]
ob = SnapshotArray(3)
ob.set(0,5)
print(ob.snap())
ob.set(0,6)
print(ob.get(0,0))输入项
Initialize the array using 3, then call set(0,5), snap(), set(0,6), get(0, 0)
输出结果
0 5