当我想同时计算两个集合(存储为列表)的并集、交集和差异时,我 [肯定会] 发明了这个 [轮子]。初始代码(不是最严格的):
dct = {}
for a in lst1:
dct[a] = 1
for b in lst2:
if b in dct:
dct[b] -= 1
else:
dct[b] = -1
union = [k for k in dct]
inter = [k for k in dct if dct[k] == 0]
oneminustwo = [k for k in dct if dct[k] == 1]
twominusone = [k for k in dct if dct[k] == -1]
然后我意识到我应该使用 00, 01, 10 和 11 而不是 -1, 1, 0, ... 所以,位置 n 的位表示集合 n 中的成员。
这可以使用 32 位 int 推广到最多 32 个集合,或者使用位数组或字符串推广到任意数量的集合。因此,您预先计算该字典一次,然后使用非常快速的 O(n) 查询来提取感兴趣的元素。例如,全 1 表示所有集合的交集。全 0 是一个特殊的 - 不会发生。
无论如何,这不是自吹自擂。这肯定是以前发明的并且有一个名字。这叫什么?这种方法是否在某处的数据库中使用?