哪种(Java)代码、库或算法最能提供位模式之间的相似性?
我追求的是一段代码、一个库例程或一个算法,该算法对两个不同的位或布尔模式的接近程度进行评分。当然,如果他们相等,那么分数应该是1,而如果一个都是真的,另一个都是假的,那么分数应该是0 位模式示例 我将要测试的位模式很多时候实际上并不相等或相同,但有时它们非常相似哪种(Java)代码、库或算法最能提供位模式之间的相似性?,java,Java,我追求的是一段代码、一个库例程或一个算法,该算法对两个不同的位或布尔模式的接近程度进行评分。当然,如果他们相等,那么分数应该是1,而如果一个都是真的,另一个都是假的,那么分数应该是0 位模式示例 我将要测试的位模式很多时候实际上并不相等或相同,但有时它们非常相似 0001 1111 0000 0000 1111 1100 0000 1110 0000 1110 0000 1111 在上面的例子中,1&2或1&3非常接近,如果我给它们打分,可能相差96%和95%。另一方面,1分和4分肯定会低很多
0001 1111 0000
0000 1111 1100
0000 1110 0000
1110 0000 1111
在上面的例子中,1&2或1&3非常接近,如果我给它们打分,可能相差96%和95%。另一方面,1分和4分肯定会低很多,可能是25%
请注意,位模式可能具有不同的长度,但仍然可以进行评分
001100
000011110000
上述两种模式将被视为完全相同
001100
00110000
上述两种模式将被视为接近但不相同,因为一旦“缩放”了#2就不同于#1。如果位模式的长度都相同,只需使用异或(
^
)运算符并计算剩余的零数
(xor
如果两个对应的位相同,则产生一个零,否则产生一个一)
如果它们的长度不同,请将位模式视为字符串,并使用类似的方法。我一直在尝试快速方法来计算逐位异或比较的匹配位数。以下是我认为最快的方法:
int num1, num2; // some bit patterns
int diff = num1 ^ num2;
int score;
for (score = 0; diff > 0; diff >>>= 1)
score += diff & 1;
分数为零表示完全匹配(假设结果长度相同)
是核心库的一小部分
返回指定的int
值的2位补码二进制表示形式中的1位数。此函数有时称为总体计数
我认为你需要更具体一些。这些模式相似吗<代码>10101010
01010101
?它们没有一个共同点,但它们是相似的(至少对我来说)@Kaj您的右边显示的模式非常接近,我的愿望组件将为它们评分相当高的95+。diff>=1
在设置高位时将无限循环,因为>
是符号扩展。你需要diff>>>=1
或者不要通过执行diff=diff&(diff-1)
迭代所有位,或者只使用Integer.bitCount(…)
Hi@B看我的例子,你的检测有点简单,只适用于精确匹配。Xor不是很聪明,它没有距离的概念。1000 vs 0100比1000 vs 0001更接近,但两者的位差均为1位。因此,根据我的回答,转换为字符串并使用Levenshtein。它计算将字符串从一个更改为另一个所需的最小编辑次数。对于我的需要来说太简单了,请参考我的编辑以获取示例。@mP,在您定义问题之前,我无法帮助您。我可以指向java.util.BitSet
。它是nextSetBit
和nextClearBit
方法,应该可以很容易地进行比特运行的实验。
public static int bitwiseEditDistance(int a, int b) {
return Integer.bitCount(a ^ b);
}