在 Python 中有效地确定幂集成员之间的子集
Determine subsets among members of a powerset efficiently in Python
所以我按以下方式为字母表的幂集成员编制了索引:
def bytecode_index(some_subset):
mask = 0
for index in bytearray(some_subset):
mask |= (1<<(index-97))
return mask
这可能有点不标准,非常欢迎改进它,但我的问题的关键实际上如下:
我怎样才能使用两个这样的掩码并有效地和 python 地确定一个是否是另一个的子集?确定 index1
是否是 index2
的子集的一种方法是比较它们的二进制字符串。如果 index1
有一个 1,而 index2
有一个 0,则对应于 index1
的集合不是对应于 index2
.
的集合的子集
为此我写了一些类似这样的东西:
def compare_binary_strings(index1,index2):
return not any(x == "1" and y == "0" for x,y in zip(bin(index1), bin(index2)))
这似乎效率不高,因为它涉及将索引转换为字符串,然后逐个比较它们。非常感谢任何帮助。
有没有更简单的操作可以快速比较两个指标?
好吧,我不知道 Python 的情况,但通常检查一个位掩码是否是另一个位掩码的子集的方法是:
(x & y) == x
如果为真,x
是 y
的子集。
这只是熟悉的
的位数学等价物
A⊆B⇔A∩B=A
所以我按以下方式为字母表的幂集成员编制了索引:
def bytecode_index(some_subset):
mask = 0
for index in bytearray(some_subset):
mask |= (1<<(index-97))
return mask
这可能有点不标准,非常欢迎改进它,但我的问题的关键实际上如下:
我怎样才能使用两个这样的掩码并有效地和 python 地确定一个是否是另一个的子集?确定 index1
是否是 index2
的子集的一种方法是比较它们的二进制字符串。如果 index1
有一个 1,而 index2
有一个 0,则对应于 index1
的集合不是对应于 index2
.
为此我写了一些类似这样的东西:
def compare_binary_strings(index1,index2):
return not any(x == "1" and y == "0" for x,y in zip(bin(index1), bin(index2)))
这似乎效率不高,因为它涉及将索引转换为字符串,然后逐个比较它们。非常感谢任何帮助。
有没有更简单的操作可以快速比较两个指标?
好吧,我不知道 Python 的情况,但通常检查一个位掩码是否是另一个位掩码的子集的方法是:
(x & y) == x
如果为真,x
是 y
的子集。
这只是熟悉的
的位数学等价物A⊆B⇔A∩B=A