旧帽子:比较位序列
我知道如何计算两个BIGINT值之间的汉明距离。在MySQL 8中,这也适用于二进制值,例如
SELECT BIT_COUNT(b'1010...' ^ b'1111...')
从某种意义上讲,您可以将其视为比较两个位序列,该序列的每个“值”都是一个位,因此可以为0或1,并且考虑值的顺序(例如1110)与1011不同。
我想做同样的事情,但是我想比较多位序列而不是一位值。
具有4位序列的示例
四个位意味着该序列的每个“值”现在可以是0到15之间的任何值。
02 12 07 15 00 05
02 12 09 15 00 05
请注意,样本序列B中的09
与样本序列A中的07
不同。因此,将A与B进行比较时,“距离”为2,因为9-7 = 2而所有其他值都相同且在相同位置。
问题:很明显,每个序列中的值都很低,可能最简单的方法是仅创建例如五列。但是,如果我有更多的值,例如32、64,甚至更多,该怎么办?一个明显的错误是,只是认为使用较高的位值时什么都不会改变,但却不起作用(例如:BIT_COUNT(5 ^ 15)
和BIT_COUNT(9 ^ 15)
都返回2
)。
我将如何存储此类序列,以及如何比较序列?就像通常使用汉明距离所做的那样,我将使用输入序列进行查询,然后首先对结果进行“最接近”匹配。
查询汉明距离:
SELECT *
FROM table
ORDER BY BIT_COUNT(column ^ 12345)
伪查询我想做的事情
SELECT *
FROM table
ORDER BY DISTANCE_FUNCTION(column ^ SEQUENCE_FUNCTION(2, 12, 7, 15, 0, 5))
我应该编写自定义MySQL函数吗?我希望避免这种情况。非常感谢您的帮助!