我们可以使用位掩码有效地表示有限(或至少索引)域中的集合存在,例如表示car
中的字母,我们可以在26位集合中表示这样,如下所示: / p>
abcdefghijklmnopqrstuvwxyz
10100000000000000100000000
然而,当然这只能表示存在,而不是重复 - carry
例如实际上有两个r
s,但是一个集合不能代表它。
multiset代表一个计数,而不仅仅是存在,所以我们可以计算重复数,但是我不清楚这是否可以在逻辑上用单个数字表示。
同事建议的一个想法是使用素数作为我们的指数,并通过它的主要因子分解代表多重集。所以我们上面的案例将成为:
car = 2^1 * 3^0 * 5^1 * ... * 61^1 * ....
carry = 2^1 * 3^0 * 5^1 * ... * 61^2 * ... 97^1 * 101^0
这是表示多重集合的合理方式吗?是否有更好的二元表示这种概念?
答案 0 :(得分:0)
琐碎:对宇宙的每个元素使用k位而不是1位。连接它们以得到一个数字,如果你关心它,但你可以等效地认为它是一个数字数组(bitset等价,一个布尔数组,也是有效和有用的)。
这可能比素因子方法占用更多的空间,但从好的方面来看,它仍然非常节省空间,你可以通过数组查找和一些小小的调整来测试存在(并提取计数),如反对查找/计算相关的素数和执行整数除法。