当我想同时计算两组(以列表形式存储)的联合,相交和差异时,我[确定地]发明了[车轮]。初始代码(不是最严格的):

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/

10-12 16:09