我有 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]]
最佳答案
从列表中删除元素的问题在于它需要 O(n):它需要按照列表中元素数量的顺序来删除该项目。
你最好使用 set
s 或者更好的 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
关于python - python中集合的分区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41684181/