Вторник, 07.05.2024, 15:28
Приветствую Вас Гость | RSS
Главная » 2009 » Декабрь » 29 » Поиск последовательных шаблонов.
Поиск последовательных шаблонов.
15:01
Теорию можно поссмотреть здесь

Т.к. задача сложная, то я решил привести свой алгоритм реализации.


   Задача поиска последовательных шаблонов представляет
довольно сложную задачу.

Возьмём, к примеру, последовательность <(a1,a2);(a3,a4,a5)>

и
попытаемся перебрать возможные варианты – мы получим их 39:

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),
(a3)

12) (a2)
, (a3)

13) (a1,a2)
, (a3)

и т.д.

  Любой из этих вариантов может оказаться решением задачи и следовательно решение задачи представляется как полный перебор и составления в результате довольно большой базы данных (либо большие временный затраты на вычисления) для дальнейших вычислений.

 

 Попытаемся найти иной подход.

Пусть имеются две последовательности:

<(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,
a3=b2 ,

С= a11*a32

Из полученного выражения, сразу ясно, что a1 входит в первый набор как
первой, так и второй последовательности.

Полученное выражение (т.к. 2 не представляется как сумма двух различных положительных чисел) также говорит нам о том, что a3 входит во второй набор как первой, так и второй последовательности.

Нам не требуется производить перебор вовсе.

 

  Пример.

 Допустим, мы получили
выражение:

  С= a11*a36

6=1+5=2+4.

Поэтому

С= a11*a36=
a11*a31a35=
a11*a32a34

В том случае 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 наборов, т.е.
получаем 59*6=354 сравнений – и это минимум.


Таким образом мы получили произведение простых чисел, нахождение НОД и 10 проверок в замен, как минимум 354 проверки.


Что получается при добавлении новой последовательности в подобной ситуации?

- при работе с базой данных, возможные наборы из новой последовательности сравниваются с дополнительной базой данных – если грубо, то все 59 с каждым из элементом из базы.

- при подходе с использованием простых чисел можно также производить сравнение с базой данных и здесь получается нахождение НОД и 10 проверок на каждый элемент из базы.






Категория: Мои статьи. | Просмотров: 1057 | Добавил: rznusl | Рейтинг: 0.0/0 |
Всего комментариев: 4
4 rznusl  
Я предложил всего лишь свой подход к решению. Решить её можно было бы и простым перебором, но нужен эффективный алгоритм.

3 Валентин  
Добрый день. Поиск последовательных шаблонов представляет действительно довольно сложную и кропотливую задачу. Отдельное спасибо за объяснения. Какое широкое применение может быть в нашей повседневной жизни. От оптимизации закупок до определения ценовой политики и маркетинговой стратегии.

2 Anita  
Спасибо. Ваша статья мне очень помогла. Я бы самостоятельно не сообразила. Вы очень доступно объяснили свой алгоритм решения.

1 Kantra  
Действительно поиск последовательных шаблонов сложная задача, как Вам удалось её решить?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]