Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用sqlite计算汉明距离和重量_Sqlite_Hamming Distance_Hammingweight - Fatal编程技术网

用sqlite计算汉明距离和重量

用sqlite计算汉明距离和重量,sqlite,hamming-distance,hammingweight,Sqlite,Hamming Distance,Hammingweight,在sqlite中是否有一种计算汉明距离和重量的好方法?它支持按位运算符,但我想根据汉明权重对结果排序,并且在sqlite中不支持位计数 更详细地说,假设我有这些行: 1011 1000 1100 0011 考虑到第一行(1011),我想得到最后一行(0011),如果你和他们的话,它有最多的1 在我的例子中,数字大约是650位,我有大约3500行 我发现这个解决方案适用于文本块,但我想要更优化的: create table ts (x blob); insert into ts(x) val

在sqlite中是否有一种计算汉明距离和重量的好方法?它支持按位运算符,但我想根据汉明权重对结果排序,并且在sqlite中不支持位计数

更详细地说,假设我有这些行:

1011
1000
1100
0011
考虑到第一行(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没有任何可以直接帮助解决这个问题的方法

在SQLite 3.8.3或更高版本中,可以使用递归手动计算匹配:

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

非常有趣,但我认为它可能比我的实现慢。此外,我的sqlite是3.7.9。您基于字符串的函数对我来说非常好。长度(替换(值,'0','')