有没有一种很好的方法来计算矩形的汉明距离和重量?它支持按位运算符,但我想根据汉明权重对结果进行排序,并且在sqlite中不支持位计数。
更详细地说,假设我有这些行:1011100011000011
并给定第一行(1011),我想得到的结果是最后一行(0011),如果您将它们与之比较,则该行具有最多的1。
在我的情况下,数字的长度约为650位,而我大约有3500行。
我已经找到了适用于文本斑点的解决方案,但是我想要更优化的解决方案:
create table ts (x blob);
insert into ts(x) values ('00010');
...
select x & '10011', length(replace( x & '10011','0','')) as weight from ts;
最佳答案
SQLite没有built-in functions可以直接帮助您。
在SQLite 3.8.3或更高版本中,您可以使用递归common table expression来手动计算匹配项:
CREATE TABLE t(x);
INSERT INTO t VALUES ('1011'), ('1000'), ('1100'), ('0011');
WITH compare(matches, rest, pattern, original) AS (
SELECT 0, x, '1011', x FROM t
UNION ALL
SELECT matches + (substr(rest, 1, 1) = '1' AND substr(pattern, 1, 1) = '1'),
substr(rest, 2),
substr(pattern, 2),
original
FROM compare
WHERE rest != '')
SELECT matches, original
FROM compare
WHERE rest = ''
ORDER BY matches DESC;
3|1011
2|0011
1|1000
1|1100