我有b
个桶0 .... b-1和m
个苹果0 .... m-1。在开始时,所有苹果都放在桶0中。
然后运行一些分析会导致苹果在桶之间移动。我已经通过使用2D列表(作为存储桶)实现了这一点,其中只要需要在存储桶之间移动苹果ID就会将其删除并附加。然而,对于我的分析来说,这是非常低效的,因为这些运动大约是数百万或数十亿。所以,我想知道是否有更好的解决方案来实现这样的结构?
顺便说一下,选择了标题,因为这与设置问题的分区非常相似,其中没有成员可以放置在多于1个子集中。这里还有一个包含4个苹果和3个桶的示例,以使其更清晰:
time 0:
a=[[0,1,2,3],[],[]]
time 1: (say apple 3 needs to be moved to bucket 2)
a=[[0,1,2],[],[3]]
答案 0 :(得分:6)
从列表中删除元素的问题在于它需要 O(n):它采用列表中元素数量的顺序来删除项目
您最好使用set
甚至更好的bitarray
,这将在O(1)中有效。
例如:
m = 50 #the number of apples
b = 10 #the number of buckets
fls = [False]*m
a = [bitarray(fls) for _ in range(b)]
a[0] = bitarray([True]*m) #add a filled bucket at index 0
def move_apple(apple_id,from_bucket,to_bucket):
a[from_bucket][apple_id] = False
a[to_bucket][apple_id] = True
答案 1 :(得分:3)
只需使用一个数组,您可以在哪个苹果存储桶号?
Min int -4
Min char !