我有 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/

10-12 19:52