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

У меня есть задача, где у меня есть три массива 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. Есть ли в нем какие-либо встроенные функции, такие как модель Левенштейна для разницы строк?

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


person Undefined Variable    schedule 03.03.2016    source источник
comment
взяв за основу A, вы можете попытаться определить, насколько смещен каждый элемент из своей позиции. Вашим ответом должен быть вариант с минимальным полным смещением. это работает ?   -  person Renuka Deshmukh    schedule 03.03.2016


Ответы (1)


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

NW в PHP

ПО на PHP

person asalic    schedule 03.03.2016
comment
спасибо за эту информацию! это замечательно! Думаю, это именно то, что я хочу. - person Undefined Variable; 03.03.2016