在sqlite中计算汉明距离和重量

时间:2014-07-27 09:48:41

标签: sqlite hamming-distance hammingweight

有没有一种很好的方法来计算sqlite中的汉明距离和重量?它支持逐位运算符,但我想根据汉明重量对结果进行排序,并且在sqlite中不支持bitcount。

更详细一点,我们说我有这些行: 1011 1000 1100 0011 给定第1行(1011)我想得到最后一行(0011)的结果,如果你和它们那么最多1s。

在我的情况下,数字长约650位,我有大约3500行。

我发现这个解决方案适用于blob的文本,但我想要更优化的东西:

create table ts (x blob); 
insert into ts(x) values ('00010');
...
select x & '10011', length(replace( x & '10011','0','')) as weight from ts;

1 个答案:

答案 0 :(得分:1)

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