importrandomfromtypingimportList,AnyclassReservoirSampler:def__init__(self,k:int):"""
Initializes the reservoir sampler.
Args:
k (int): The number of items to maintain in the reservoir.
"""self.k=kself.reservoir=[]self.stream_size=0# Tracks the number of items processed in the streamdefadd_to_reservoir(self,new_item:Any)->None:"""
Processes a new item from the stream and updates the reservoir.
Args:
new_item (Any): The new item from the stream to process.
"""self.stream_size+=1iflen(self.reservoir)<self.k:# Fill the reservoir until it reaches size kself.reservoir.append(new_item)else:# Replace an existing item with a decreasing probabilityj=random.randint(1,self.stream_size)ifj<=self.k:self.reservoir[j-1]=new_itemdefget_reservoir(self)->List[Any]:"""
Returns the current reservoir.
Returns:
List[Any]: The list of items in the reservoir.
"""returnself.reservoir