![]() |
|
![]() ![]() ![]() |
|
shwan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 23.4.2012 Репутация: нет Всего: нет |
Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ.
|
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Если "буквы алфавита" встречаются с равной частотой, то честно говоря, не представляю себе ничего, кроме последовательного прохода всех положений от начала строки до конца (минус длина подстроки, конечно).
Но проходить можно по-разному. Какой вариант лучше будет во многом зависеть от используемого языка и даже его реализации. 1. Можно тупо сравнивать символы. Тогда придется сравнивать 8-битные буквы. Это не так глупо, так как в большинстве языков сравнение символов уже оптимизировано. 2. Поскольку символов всего 6, 8-битного представления не нужно. Достаточно 3-битного. Если можно написать оптимизированную процедуру сравнения 3-битных символов, скорее всего будет быстрее. 3. Перевести обе строки в биты и сравнивать побитно. Опять же, при прочих равных, такое сравнение будет наиболее быстрым. Однако, в этом случае надо будет учесть-отбросить редкие случаисовпадения со сдвигом; т.е. случаи когда битовая последовательность совпала, но не с начала буквы, а откуда-то с середины. Впрочем, даже простая проверка в символьной форме много времени на займет по сравнению со временем прохода. ______________ Теперь, если частотность букв не одинакова. Например, есть у нас в подстроке Ъ - редко встречающийся символ. Тогда быстрее всего будет искать в строке этот символ, а потом просто сравнивать "хвосты" в обе стороны. Эту идею можно развить и дальше. Искать самый редкий символ, потом смотреть есть ли на должном расстоянии от него второй по невстречаемости и так далее. Но большой ли это даст выигрыш - не скажу сразу. ______________ Если я недостаточно подробно расписал - требуйте пояснений ![]() -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
nworm |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 502 Регистрация: 22.10.2005 Репутация: 4 Всего: 8 |
Разветвлённая теория есть на эту тему.
Наверное, это Вы хотели: Тут можете посмотреть сравнение алгоритмов поиска подстроки в строке Есть ещё алгоритмы поиска массива подстрок (например, алгоритм Ахо-Корасик) |
|||
|
||||
disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: 2 Всего: 3 |
Посмотрите алгоритмы типа Хорспула, Бойера-Мура или Кнута-Морриса-Пратта, и прикиньте, дают ли они существенный выигрыш при ваших конкретных условиях. |
|||
|
||||
nike00 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 30.3.2012 Репутация: нет Всего: нет |
Наверное кроме вопроса ТС-у стоило разместить ссылку на Хабр? Вдруг кого-то тоже заинтеерсует возможность выиграть 1 из Asus Zenbook UX31E
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |