当我想同时计算两组(以列表形式存储)的联合,相交和差异时,我[确定地]发明了[车轮]。初始代码(不是最严格的):
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是一个特殊的1-不会发生。
无论如何,这不是在吹牛角。这肯定是以前发明的,并且有名字。这叫什么?数据库中是否使用了这种方法?
最佳答案
是的,有时在数据库中使用它,例如PostgreSQL。正如提到的维基百科:
(来自http://en.wikipedia.org/wiki/Bitmap_index)
关于python - 计算联合和相交的这种编程方法的正式名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2010132/