Поиск последовательных шаблонов. | 15:01 |
Т.к. задача сложная, то я решил привести свой алгоритм реализации.
Задача поиска последовательных шаблонов представляет Возьмём, к примеру, последовательность <(a1,a2);(a3,a4,a5)> и
1) (a1)
2) (a2)
3) (a1,a2)
4) (a3)
5) (a4)
6) (a5)
7) (a3,a4)
8) (a3,a5)
9) (a4,a5)
10) (a3,a4,a5)
11) (a1),
12) (a2)
13) (a1,a2)
и т.д.
Любой из этих вариантов может оказаться решением задачи и следовательно решение задачи представляется как полный перебор и составления в результате довольно большой базы данных (либо большие временный затраты на вычисления) для дальнейших вычислений.
Попытаемся найти иной подход.
Пусть имеются две последовательности:
<(a1,a2);(a3,a4,a5)>
<(b1,b2);(b3,b4,b5,b6),(b7)>
Возьмём в качестве ai, bj простые числа b и
A=a1*a2*a3*a4*a5
B=b1*b2*b3*b4*b5*b6*b7
Найдём С=НОД(A,B).
Ясно, что решение нашей (поставленной исходно) задачи в принятых обозначения будет состоять из делителей числа С.
И всё бы было хорошо, но при этом не учитывается порядок
Например.
С= a1*a3 и a1=b1, a3=b2 ,
то решением задачи может быть только <(a1)>.
Если же
С= a1*a3 и a1=b1, a3=b4 ,
то решением задачи могут быть уже следующие последовательности:
<(a1)>, <(a2)>, < (a1); (a2)>.
Опять придётся делать перебор (теперь уже на соответствие исходному порядку следования), хотя он и гораздо меньше (для данной ситуации надо проверить3 последовательности вместо 39 . И всего будет 15 проверок, и даже меньше – 5, т.к. последовательности вида <(ai)>, всегда допустимы).
При более длинных последовательностях количество проверок может возрасти. Поэтому введём порядок для множителей.
Будем возводить множители в степень, соответствующие их номеру набора, т.е. произведения
A=a1*a2*a3*a4*a5
B=b1*b2*b3*b4*b5*b6*b7
Преобразуются в
A=a11*a21*a32*a42*a52
B=b11*b21*b32*b42*b52*b62*b73
С=НОД(A,B).
Пример.
a1=b1,
С= a11*a32
Из полученного выражения, сразу ясно, что a1 входит в первый набор как
Полученное выражение (т.к. 2 не представляется как сумма двух различных положительных чисел) также говорит нам о том, что a3 входит во второй набор как первой, так и второй последовательности.
Нам не требуется производить перебор вовсе.
Пример.
Допустим, мы получили
С= a11*a36
6=1+5=2+4.
Поэтому
С= a11*a36=
В том случае a1
Для а3 возможны уже варианты:
- a3 входит в шестой набор либо первой, либо второй последовательности.
- a3 входит в первый и в пятый наборы либо первой, либо второй последовательности.
- a3 входит во второй и в четвёртый наборы либо первой, либо второй
Сколько здесь проверок? – максимум 10.
Сколько проверок предполагает полный перебор?
– если обе последовательности содержат не менее 6 наборов каждая (каждый набор содержит не менее одного числа), то
- из первой последовательности мы получаем как минимум количество вариантов:
6+5+4+3+2+1+4+3+2+1+3+2+1+2+1+1+3+2+1+2+1+1+2+1+1+1=11+14+12+8+5+6=59
- эти 59 вариантов мы должны проверить на вхождение во вторую последовательность, которая содержит, как минимум 6 наборов, т.е.
Таким образом мы получили произведение простых чисел, нахождение НОД и 10 проверок в замен, как минимум 354 проверки.
Что получается при добавлении новой последовательности в подобной ситуации?
- при работе с базой данных, возможные наборы из новой последовательности сравниваются с дополнительной базой данных – если грубо, то все 59 с каждым из элементом из базы.
- при подходе с использованием простых чисел можно также производить сравнение с базой данных и здесь получается нахождение НОД и 10 проверок на каждый элемент из базы. | |
Категория: Мои статьи. | Просмотров: 1095 | Добавил: rznusl | Рейтинг: 0.0/0 | |
Всего комментариев: 4 | |||||
| |||||