python中的一个集合的分区

时间:2017-01-16 20:04:08

标签: python set subset partition

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

2 个答案:

答案 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 !