Выявление сходства последовательностей в массивах

У меня есть задача, где у меня есть три массива A, B, C. Все они содержат одинаковые данные. Для простоты предположим, что данные имеют номера от 1 до 5. Данные будут в разных беспорядочных последовательностях. Я хочу выяснить среди B & C какой массив имеет данные, наиболее похожие на A.

Eg:
A = 1,2,3,4,5
B = 1,2,3,5,4
C = 4,1,2,3,5

В этом случае легко визуально понять, что B больше похож на A. Но это становится более сложным для действительно перемешанных последовательностей.

Eg:
A = 1,2,3,4,5
B = 5,3,1,4,2
C = 4,1,2,3,5

В этом случае я бы предположил, что C ближе к A. Я думаю, что это предположение можно количественно определить следующим образом: Сколько элементов имеют одинаковую последовательность в обоих массивах? В вышеприведенном примере подпоследовательность [1,2,3] одинакова в обоих массивах. Второй вопрос: какова разница смещений между подобной подпоследовательностью? В этом случае это 1, потому что подпоследовательность начинается с индекса 0 для A и индекса 1 для C.

Так что количество элементов в совпадающей последовательности и их смещения — вот что я собираюсь использовать. Я планирую добавить взвешивание к этим двум объектам (количество элементов в соответствующей последовательности и разница смещения в их появлении)

Имеет ли это смысл? Мне нужно только приблизительное приближение сходства, и результаты не должны быть точными. Существуют ли формальные математические или структурные модели данных, которые решают эту проблему?

Кстати, проект, в котором мне это нужно, реализован на PHP. Есть ли в нем встроенные функции, такие как модель Левенштейна для разности строк?

Любые предложения приветствуются!

1

Решение

Ну, я полагаю, вы можете придумать свой собственный алгоритм (например, сгенерировать все суффиксы, а затем найти их, а затем определить процедуру оценки) или вы можете использовать хорошо известный алгоритм, такой как
Smith-Waterman для локального выравнивания или Needleman-Wunsch для глобального. Преимущество этих алгоритмов в том, что они хорошо понятны и дают вам все возможные выравнивания (и вы можете выбрать лучший для вашего случая).

СЗ в PHP

SW в PHP

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]