Хранение и сравнение многобитовых последовательностей в MySQL - PullRequest
0 голосов
/ 29 января 2019

Старая шляпа : сравнение битовых последовательностей

Я знаю, как рассчитать расстояние Хемминга между двумя значениями 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

Обратите внимание, что 09 в образце последовательности B отличаетсяиз 07 в выборочной последовательности A. В результате «расстояние» при сравнении 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?Я бы хотел этого избежать.Любая помощь высоко ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...