我在计算集合(位向量)的Jaccard相似度时遇到此问题:
v1 = 10111
v2 = 10011
交叉点大小= 3; (我们怎么能找到它?)
联合的大小= 4,(我们怎么能找到它?)
Jaccard相似度=(交集/并集)= 3/4
但我不明白我们怎么能找到两个载体的“交集”和“联合”。
请帮帮我。
答案 0 :(得分:4)
大概你对“交集”和“联合”的定义是“在两个值中设置的位数”和“在任一值中设置的位数”....这是(假设你使用类似{{ 1}}或int
为向量):
long
接下来,您只需要实施int intersection = CountBits(v1 & v2);
int union = CountBits(v1 | v2);
。 This Stack Overflow question可以帮助你。
您可能希望使用BitArray
,而不是使用CountBits
或int
。这有long
和And
方法,看起来就像它们不会改变原始值一样,但它并不完全清楚。您需要找出计算Or
中设置的位的最佳方法 - 只需BitArray
即可。