Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > алгоритм поиска подстроки


Автор: shwan 23.4.2012, 22:29
Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ.

Автор: _Y_ 23.4.2012, 23:18
Если "буквы алфавита" встречаются с равной частотой, то честно говоря, не представляю себе ничего, кроме последовательного прохода всех положений от начала строки до конца (минус длина подстроки, конечно).

Но проходить можно по-разному. Какой вариант лучше будет во многом зависеть от используемого языка и даже его реализации. 

1. Можно тупо сравнивать символы. Тогда придется сравнивать 8-битные буквы. Это не так глупо, так как в большинстве языков сравнение символов уже оптимизировано.

2. Поскольку символов всего 6, 8-битного представления не нужно. Достаточно 3-битного. Если можно написать оптимизированную процедуру сравнения 3-битных символов, скорее всего будет быстрее.

3. Перевести обе строки в биты и сравнивать побитно. Опять же, при прочих равных, такое сравнение будет наиболее быстрым. Однако, в этом случае надо будет учесть-отбросить редкие случаисовпадения со сдвигом; т.е. случаи когда битовая последовательность совпала, но не с начала буквы, а откуда-то с середины. Впрочем, даже простая проверка в символьной форме много времени на займет по сравнению со временем прохода.

______________

Теперь, если частотность букв не одинакова. Например, есть у нас в подстроке Ъ - редко встречающийся символ. Тогда быстрее всего будет искать в строке этот символ, а потом просто сравнивать "хвосты" в обе стороны.

Эту идею можно развить и дальше. Искать самый редкий символ, потом смотреть есть ли на должном расстоянии от него второй по невстречаемости и так далее. Но большой ли это даст выигрыш - не скажу сразу.

______________


Если я недостаточно подробно расписал - требуйте пояснений smile 

Автор: nworm 23.4.2012, 23:18
Разветвлённая теория есть на эту тему.

Наверное, это Вы хотели:
http://algolist.manual.ru/search/esearch/

Есть ещё алгоритмы поиска массива подстрок (например, http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%90%D1%85%D0%BE_%E2%80%94_%D0%9A%D0%BE%D1%80%D0%B0%D1%81%D0%B8%D0%BA)

Автор: disputant 24.4.2012, 04:56
Цитата(shwan @ 23.4.2012,  22:29)
Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ.

Посмотрите алгоритмы типа Хорспула, Бойера-Мура или Кнута-Морриса-Пратта, и прикиньте, дают ли они существенный выигрыш при ваших конкретных условиях.

Автор: nike00 26.4.2012, 10:39
Наверное кроме вопроса ТС-у стоило разместить ссылку на http://habrahabr.ru/company/intel/blog/142312/? Вдруг кого-то тоже заинтеерсует возможность выиграть 1 из Asus Zenbook UX31E smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)