在MySQL中存储和比较多位序列

时间:2019-01-29 17:15:26

标签: mysql sql

旧帽子:比较位序列

我知道如何计算两个BIGINT值之间的汉明距离。在MySQL 8中,这也适用于二进制值,例如

SELECT BIT_COUNT(b'1010...' ^ b'1111...')

从某种意义上讲,您可以将其视为比较两个位序列,该序列的每个“值”都是一个位,因此可以为0或1,并且考虑值的顺序(例如1110)与1011不同。

我想做同样的事情,但是我想比较多位序列而不是一位值

具有4位序列的示例

四个位意味着该序列的每个“值”现在可以是0到15之间的任何值。

  • 样本序列A:02 12 07 15 00 05
  • 样本序列B: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函数吗?我希望避免这种情况。非常感谢您的帮助!

0 个答案:

没有答案