2 つのセット (リストとして格納されている) の和集合と交差と差分を同時に計算したいときに、この [ホイール] を [確実に再] 発明しました。初期コード (厳密ではない):
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]
次に、-1、1、0、... の代わりに 00、01、10、および 11 を使用する必要があることに気付きました。したがって、位置 n のビットは、セット n のメンバーであることを示します。
これは、32 ビットの int を使用して最大 32 セットに一般化するか、bitarray または文字列を使用して任意の数のセットに一般化できます。したがって、このディクショナリを 1 回事前計算してから、非常に高速な O(n) クエリを使用して対象の要素を抽出します。たとえば、すべて 1 はすべてのセットの交差を意味します。すべての 0 は特殊なものであり、発生しません。
とにかく、これは自分の角を鳴らすためではありません。これは確かに以前に発明されたもので、名前があります。それはなんと呼ばれていますか?このアプローチはどこかのデータベースで使用されていますか?