![]() |
|
|
![]()
|
|
| tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Длина двоичной последовательности "A" - m символов.
Длина двоичной последовательности "B" - n символов. Известно, что m гораздо меньше n (т.е. на грани сравнимости, ну, например, 10^6<n/m<10^7). Сколько раз встречается последовательность A в последовательности B? |
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Можно сделать так:
1. Сделать логическое И последовательности А и B (A & B) 2. Проверить на равенство результата коньюнкции с B (Результат == B) Если равно то увеличить счетчик на 1 3. Сделать логический сдвиг вправа последовательности B на 1 шаг (B << 1) 4. Перейти к шагу 1, если мы не вышли за граници -------------------- Пролетал мимо. |
|||
|
||||
| Breed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 6.4.2006 Репутация: нет Всего: нет |
Для ускорения поиска можно сдвигать не на один бит а на определенные заранее К бит.
Для этого надо найти в посл-ти А максимальную подпоследовательность начинающуюся с начала и равную подпоследовательности той же длины на которую заканчивается А. То есть если А = 110110, то надо сдвигать на 3 символа за каждое сравнение, если например А = 100001, то можно сдвигать на 5 символов, а если А = 111111, то придется сдвигать на 1 символ... |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Предположим, что А=110110 последовательность В = 11101100000, Если мы будем сдвигать по три бита, то получим следующие варианты цепочки В: 1. 111011 (00000) - в скобках остаток цепочки В, который длиней А. 2. 011000 (00) 3. 00000 Т.е ни одного совпадения. Давайте проверим если будем сдвигать на один бит: 1. 111011(00000) 2. 110110(0000) -! Совпадение. 3. 101100(000) 4. 011000(00) 5. 110000(0) 6. 100000 Как видим два варианта дают различный вариант, а значит один из них не верный. Конечно есть третий вариант - при неудачном сравнении сдвигать на 1 бит, при совпадении на несколько. Но есть "но". Будет хорошо если последовательность А заранее известна, и можно заранее определить кол-во сдвиговых бит. А если она не определена заранее, то определение длины максимально длиного сдвига, может занять дольше времени, чем проверка с малым сдвигом. |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Составляешь конечный автомат по искомой последовательности и ищешь. Сложность- линейная.
-------------------- Всем добра |
|||
|
||||
| esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Простите, линейная от чего:? -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
| tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: нет Всего: 8 |
Ну так сколько раз? Формула бывает?
|
|||
|
||||
| Breed |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 6.4.2006 Репутация: нет Всего: нет |
Вобщем-то это я и имел в виду, только как-то написал не так... :-)
Я думаю, что при условии "Известно, что m гораздо меньше n (т.е. на грани сравнимости, ну, например, 10^6<n/m<10^7)." (Описано автором) эта оптимизация может очень даже пригодиться. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Кстати всю строку Б каждый раз сравнивать не обязательно. Например для 8битного сравнения достаточно сравнивать по одному байту,
до тех пор пока совпадают. Как только обнаружили разницу, дальше проверять не имеет смысла, поетому сдвигаем цепочку на один байт и начинаем заново побайтово проверять цепочку Б. П.С. Надеюсь я понятно выразился, если нет попытаюсь заново. Это сообщение отредактировал(а) mes - 2.5.2006, 23:48 |
|||
|
||||
| Alagert |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
От входной длины. Только нужен не обыкновенный автомат, а машина Тьюринга. Тк у простого КА нет памяти. --------------------
[color=blue]BORN TO BE ROOT#[/color] |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Такой не знаю. Могу предположить, что это КА с памятью
Просто счетчик, и чего мудрить? -------------------- Всем добра |
|||
|
||||
| Alagert |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 25.8.2005 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вообщем то так и есть. У классического КА нет памяти. Либо семмантики навешивать, те юзать счетчик в нужном состоянии.
--------------------
[color=blue]BORN TO BE ROOT#[/color] |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Можно использовать КА со стеком, из которого не будем ничего убирать, а приписывать только единицы.
Вроде, задачу решили. -------------------- Всем добра |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |